2009-04-07 95 views
5

錯誤:
錯誤C2678:二進制「==」:沒有操作員發現它採用類型「const的條目」的左邊的操作數(或沒有可接受的轉化率)C++模板類誤差與運算符==

功能:

template <class T, int maxSize> 
int indexList<T, maxSize>::search(const T& target) const 
{ 
    for (int i = 0; i < maxSize; i++) 
     if (elements[i] == target) //ERROR??? 
      return i;  // target found at position i 

    // target not found 
    return -1; 
} 

indexList.h
indexList.cpp

這是假設是一個重載運算符?作爲一個模板課,我不確定我是否理解錯誤?

溶液 - 在類現在聲明爲常量的過載功能:

//Operators 
bool entry::operator == (const entry& dE) const <-- 
{ 
    return (name ==dE.name); 

} 
+0

http://stackoverflow.com/a/38887476/1599699 – Andrew 2016-08-11 04:52:26

回答

9

開始通過閱讀錯誤的文字,正是因爲它是:

binary '==' : no operator found which takes a left-hand operand of type 'const entry'

這意味着它不能找到任何==運營商接受的entry類型作爲其左操作數。此代碼無效:

entry const e; 
if (e == foo) 

您向我們展示了您的列表類的代碼,但這不是錯誤所在。錯誤是關於entry類型缺少運算符,無論如何。請給這個類別一個operator==函數,或者聲明一個獨立的operator==函數,它接受一個const entry&作爲它的第一個參數。

struct entry { 
    bool operator==(const entry& other) const; 
}; 
// or 
bool operator==(const entry& lhs, const entry& rhs); 

我認爲後者是首選的風格。

6

問題指的是在這種情況下被使用不具有==限定的操作者的類型T。我會從你的問題中猜測這是一個「入口」類。

也可能是'entry'類沒有正確定義運算符==以將const條目&作爲參數。

+0

賓果,可能是值得解釋的正確定義,但(內聯友元函數)或有可能是一些* FUN *鏈接器問題以後= D – 2009-04-07 16:03:23

+0

爲什麼元素必須是const? – 2009-04-07 16:03:48

+0

因爲你的模板方法被標記爲const。這意味着編譯器必須檢查你是否不對該類的內部數據調用非const操作(element [i]) – 2009-04-07 16:05:21

2

這很可能是「const中毒」,其中在搜索功能聲明中使用const將強制您添加const版本的所有調用的下游函數。

在函數聲明const,該this指針被認爲是const,這意味着您使用的所有成員通過該指針被認爲const爲好。如果您的operator ==()對於您所擅長的任何類型T沒有明確指定const參數,則會出現此錯誤。

如果你不能確保你使用的所有Ts將有適當的operator ==()調用,我會刪除成員函數模板上的const說明符。

+0

在模板類中,==運算符未定義,它是否需要?在這個函數中刪除這個const中毒的最好方法是什麼? – 2009-04-07 16:05:27

1

由於您提供的代碼不包含模板的實例化,因此您很難知道哪裏出了問題,因此您用作此類的參數的類型T應該有operator==()

在另一個說明中,模板的函數定義應該與類一起存在於.h文件中,否則編譯器將無法正確實例化它。

1

默認情況下,未定義用戶定義類型的相等運算符。這與您的模板類沒有任何關係,而是您的structclass「條目」。

因此,您必須覆蓋struct entryclass entry中的相等運算符。或者,如果您不想強制使用該模板的所有內容來定義相等運算符,則可以修改模板接口以接受執行相等比較的Comparator。

0

有時是很不夠寫

... 
    if (target == elements[i]) 
...