2012-07-25 133 views
2

這是我的代碼,以找到在地圖中的值:錯誤C2678:二進制「<」:沒有操作員發現它接受一個左邊的操作數...(或者沒有可接受的轉化率)

bool myclass::getFreqFromCache(plVariablesConjunction& varABC, vector<plFloat>& freq) 
{ 
std::map<plVariablesConjunction, std::vector<plFloat>>::iterator freqItr; 
    freqItr = freqCache.find(varABC); 

    if (freqItr != freqCache.end()) 
     { 
     freq = freqItr->second; 
     return true; 
     } 
} 

「PlVariablesConjunction」是一個ProBT庫數據類型。它包含運算符「==」,如果兩個變量發現相同,則返回true,否則返回false。

這裏是錯誤:

C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(125): error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const plVariablesConjunction' (or there is no acceptable conversion) 
1>   E:\ProBT22\probt-spl-2.2.0-expires-20121130-vc10-dynamic-release\include\plSymbol.h(71): could be 'bool operator <(const plSymbol &,const plSymbol &)' [found using argument-dependent lookup] 
1>   while trying to match the argument list '(const plVariablesConjunction, const plVariablesConjunction)' 
1>   C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(124) : while compiling class template member function 'bool std::less<_Ty>::operator()(const _Ty &,const _Ty &) const' 
1>   with 
1>   [ 
1>    _Ty=plVariablesConjunction 
1>   ] 
1>   C:\Program Files\Microsoft Visual Studio 10.0\VC\include\map(71) : see reference to class template instantiation 'std::less<_Ty>' being compiled 
1>   with 
1>   [ 
1>    _Ty=plVariablesConjunction 
1>   ] 
1>   C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xtree(451) : see reference to class template instantiation 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>' being compiled 
1>   with 
1>   [ 
1>    _Kty=plVariablesConjunction, 
1>    _Ty=std::vector<plProbValue>, 
1>    _Pr=std::less<plVariablesConjunction>, 
1>    _Alloc=std::allocator<std::pair<const plVariablesConjunction,std::vector<plProbValue>>>, 
1>    _Mfl=false 
1>   ] 
1>   C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xtree(520) : see reference to class template instantiation 'std::_Tree_nod<_Traits>' being compiled 
1>   with 
1>   [ 
1>    _Traits=std::_Tmap_traits<plVariablesConjunction,std::vector<plProbValue>,std::less<plVariablesConjunction>,std::allocator<std::pair<const plVariablesConjunction,std::vector<plProbValue>>>,false> 
1>   ] 
1>   C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xtree(659) : see reference to class template instantiation 'std::_Tree_val<_Traits>' being compiled 
1>   with 
1>   [ 
1>    _Traits=std::_Tmap_traits<plVariablesConjunction,std::vector<plProbValue>,std::less<plVariablesConjunction>,std::allocator<std::pair<const plVariablesConjunction,std::vector<plProbValue>>>,false> 
1>   ] 
1>   C:\Program Files\Microsoft Visual Studio 10.0\VC\include\map(81) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled 
1>   with 
1>   [ 
1>    _Traits=std::_Tmap_traits<plVariablesConjunction,std::vector<plProbValue>,std::less<plVariablesConjunction>,std::allocator<std::pair<const plVariablesConjunction,std::vector<plProbValue>>>,false> 
1>   ] 
1>   e:\probt22\work\yasin\testmmhcfinalversion\testmmhc_mi_probt_sw\mmhc\slidingWindow.h(55) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled 
1>   with 
1>   [ 
1>    _Kty=plVariablesConjunction, 
1>    _Ty=std::vector<plProbValue> 
1>   ] 
+0

哪裏是操作者<類型plVariablesConjunction? – ForEveR 2012-07-25 10:46:04

+0

您發佈的代碼不會在地圖中插入任何內容,我敢打賭,這實際上與錯誤無關。 – 2012-07-25 10:47:02

+0

對不起,發佈編輯 – DataMiner 2012-07-25 10:57:45

回答

7

std::map(通常)實現爲二叉搜索樹,最常見紅黑樹。它需要線性順序來爲關鍵值定義,以在樹中找到正確的位置。這就是爲什麼std::map試圖在插入的鍵值上調用operator<。您的班級不提供operator<。請爲您的課程定義operator<或爲模板提供比較功能:std::map<plVariablesConjunction, std::vector<plFloat>, my_comparison_function>

+0

是的,考慮到我的類變量連接,有沒有其他的選擇? – DataMiner 2012-07-25 11:00:20

+0

@ user986789:「其他選擇」是什麼意思?實現比較函數(作爲函數,函子或操作符<'),或使用其他容器類型或使用另一種類型的'std :: map'。我不知道你的應用程序,現在也不在乎學習ProBT,所以我不知道哪種解決方案更好。 – 2012-07-25 11:30:48

+0

@ user986789:從什麼ProBT(R)API ;-)文檔的一瞥我見過,'plVariablesConjunction'是幾個子類的基類。這意味着,除非1)你控制自己的執行,2)你真** **知道你在做什麼,你不應該把它通過* *值到容器中。 'std :: map 2012-07-25 11:40:26

3

地圖<>不使用operator==檢查插入的值。它需要通過operator<來比較關鍵值。

+0

謝謝,plVariableConjunction數據類型不包含比較運算符< or >。它只是包含「==」,「=」,「=!」或「 - 」 – DataMiner 2012-07-25 10:53:38

+0

@ user986789:要麼你定義自己的運營商<該類型或你寫仿函數這樣做比較(兩者都需要你有辦法告訴兩個連詞中的哪一個「較小」)。如果你不能在它們之間得到訂單,也許你需要一個不同的容器。 – 2012-07-25 11:00:29

3

使用地圖類,需要兩個,也可能是三個,類型爲模板:

std::map <key_type, data_type, [comparison_function]>

要麼你需要提供一個比較函數或重載<運營商在重點班。

注意,比較功能是在括號,表明它是可選的,只要你爲key_type具有小於操作,<,定義

相關問題