'Overloading == and !== when object is a pointer

I am new to writing operators (in this case == and !=). I have done a bit of research and so far came up with:

bool operator==(const SPECIAL_EVENT_S &rsEvent)
{
    bool bSame = false;

    if (rsEvent.datEvent == m_datSpecialEvent &&
        rsEvent.strEvent == m_strNotes &&
        rsEvent.strLocation == m_strLocation &&
        rsEvent.datEventStartTime == m_datEventStartTime &&
        rsEvent.datEventFinishTime == m_datEventFinishTime &&
        gsl::narrow<bool>(rsEvent.bEventAllDay) == m_bEventAllDay &&
        gsl::narrow<bool>(rsEvent.bSetReminder) == m_bSetReminder &&
        rsEvent.iReminderUnitType == m_iReminderUnitType &&
        rsEvent.iReminderInterval == m_iReminderInterval &&
        rsEvent.iImageWidthPercent == m_wImageWidthPercent &&
        rsEvent.strImagePath == m_strImagePath &&
        rsEvent.strTextBeforeImage == m_strTextBeforeImage &&
        rsEvent.strTextAfterImage == m_strTextAfterImage &&
        rsEvent.eType == m_eVideoconfType &&
        rsEvent.sBSSTI == m_sBSSTI)
    {
        // The fundamental information is unchanged
        bSame = true;
    }

    // Now compare the MWB Event Type
    if (bSame)
    {
        switch (rsEvent.eMWBEventType)
        {
        case EventTypeMWB::MWBBethelSpeakerServiceTalk:
            return m_bSpecialEventBethelServiceTalk;
        case EventTypeMWB::MWBVideoconferenceAssembly:
            return m_bSpecialEventVideoconf && m_eVideoconfType == VideoConferenceEventType::Live;
        case EventTypeMWB::MWBVideoconferenceConvention:
            return m_bSpecialEventVideoconf && m_eVideoconfType == VideoConferenceEventType::Recorded;
        case EventTypeMWB::MWBSpecialEvent:
            return m_bSpecialEvent;
        case EventTypeMWB::MWBMemorial:
            return m_bEventMemorial;
        case EventTypeMWB::MWBCircuitOverseerMeeting:
            return m_bCircuitVisit || m_bCircuitVisitGroup;
        case EventTypeMWB::MWBMeeting:
            return !m_bNoMeeting;
        default:
            bSame = false;
        }
    }

    return bSame;
}
bool operator!=(const SPECIAL_EVENT_S& rsEvent)
{
    return !(rsEvent == *this);
}

What surprised me what when I then tried to use these operators:

if (pEntry != sEvent)
{
    AfxMessageBox(_T("The special event information has changed"));
}

It does not like pEntry being a pointer. In the end I did this:

if (*pEntry != sEvent)
{
    AfxMessageBox(_T("The special event information has changed"));
}
  1. Why was this an issue in the first place? I ask that because if this was a standard function it would not matter if the object was a pointer or not.
  2. What is the correct way to cater for this scenario?

For example:

  • object->Function(value)
  • object.Function(value)

Function can be used both by the object when it is / is not a pointer. So why not with an operator?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source