операторы перегрузки == и! =: компилятор стонет неоднозначно - PullRequest
0 голосов
/ 12 мая 2011

У меня есть следующий код:

bool operator==(const Inc::CReminderItem& Item1, const Inc::CReminderItem& Item2)
{
    bool bDate = false, bDesc = false, bInfo = false, bWeekday = false;

    if(Item1.m_Date == Item2.m_Date)
        bDate = true;
    if(Item1.m_strDescription == Item2.m_strDescription)
        bDesc = true;
    if(Item1.m_strInfoShort == Item2.m_strInfoShort)
        bInfo = true;
    if(Item1.m_nWeekday == Item2.m_nWeekday)
        bWeekday = true;

    return(bDate && bDesc && bInfo && bWeekday);
}

bool operator!=(const Inc::CReminderItem& Item1, const Inc::CReminderItem& Item2)
{
    return !(Item1 == Item2);    // <<--- ambiguous here!
}

оба оператора объявлены как дружественные операторы в классе.

ошибка:

ошибка C2593: «оператор ==» неоднозначный

Я не уверен, почему это неоднозначно, О_о, и как это исправить. Любая помощь с благодарностью:)

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Во-первых, если это "неоднозначно", я бы ожидал, что другие operator== будут присутствует где-то. Но трудно сказать, что это за конкретный компилятор. на самом деле пытается сказать вам это сообщениями об ошибках.

Во-вторых, вы действительно не показываете достаточно кода, чтобы кто-нибудь мог сказать, что неправильно. Существует ряд возможных ошибок: класс, в котором друг объявлен, и эти определения находятся в разных пространствах имен, подпись друга немного отличается и т. д. Если Inc пространство имен, эти операторы также должны быть в Inc. Иначе, вы объявили operator== в Inc в объявлении друга, и operator== в глобальном пространстве имен здесь. Оба считаются, которые приводит к неоднозначности.

(Обычно я обращаюсь с этим, чтобы определить функцию-член, isEqual, и пусть оба operator== и operator!= вызывают его. Тот кстати, в объявлении друга нет необходимости.)

0 голосов
/ 12 мая 2011

Может быть, вы определили operator== в области видимости класса, как

class CReminderItem {
public:
    bool operator==(CReminderItem const&) const;
};

Это неоднозначно с глобальной перегрузкой оператора.

...