2011-05-12 50 views
0

我有以下代碼:運算符重載==和=:編譯呻吟歧義

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: '運算==' 是 曖昧

我不知道,爲什麼它是曖昧O_O以及如何解決這個問題。 任何幫助是極大的讚賞:)

+1

編譯器應該告訴你像*可能的候選人是...... *。否則,也許存在一個成員函數,或者你有'CReminderItem'的一些隱式轉換? – 2011-05-12 09:42:12

+0

是否說哪些是可能導致歧義的候選人? – Naveen 2011-05-12 09:42:52

+0

有沒有可能的候選人,也不應該有任何明顯的轉換(visual studio 2010) – Incubbus 2011-05-12 11:47:17

回答

2

首先,如果它是「模棱兩可」,我會期待其他operator==爲 某處。但是很難說任何特定的編譯器是否真的試圖告訴你它是錯誤消息。

二,你真的沒有顯示足夠的代碼給任何人說什麼是 錯誤。有一些可能出現的錯誤:在 的朋友聲明,這些定義在不同的命名空間中的類, 的朋友的簽名是微妙的不同,等等。如果Inc是 命名空間,這些運營商必須在Inc作爲好。否則, 你已經在朋友聲明中聲明瞭operator==,Inc,在這裏聲明瞭全局名稱空間中的和operator==。兩者都被考慮在內,其中 導致含糊不清。

(我通常處理這個問題的方法是定義一個成員函數, isEqual,並同時擁有operator==operator!=調用它。這 方式,沒有必要爲友元聲明。)

0

也許你已經定義的類範圍內的operator==

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

這就是曖昧與全球運算符重載。

+0

這不是一個定義。 – 2011-05-12 10:11:32

+0

-o - 我的錯。一個聲明足以讓編譯呻吟這樣的錯誤。我想知道爲什麼編譯認爲這是模棱兩可的,而不是重新定義。 – neuront 2011-05-12 11:08:33

+0

因爲'bool operator ==(CReminderItem const&)const'與'bool CReminderItem :: operator ==(CReminderItem const&)const'不一樣? – 2011-05-12 11:25:23