2014-11-06 58 views
2
#include <map> 
using namespace std; 

class C { 
public: 
    C(map<int,int> m) { } 
    int operator()(int a, int b) { 
     return a < b; 
    } 
}; 

int main() {  
    map<int, int> m; 
    map<int, int, C> mymap(C(m)); 
    mymap.insert(pair<int,int>(1,1)); 
} 

爲什麼我會收到以下錯誤?:無法使用客戶比較函數構造std :: map?

main.cpp: In function 'int main()': 
main.cpp:16:11: error: request for member 'insert' in 'mymap', which is of non-class type 'std::map<int, int, C>(C)' 
mymap.insert(pair<int,int>(1,1)); 

這裏是coliru鏈接:http://coliru.stacked-crooked.com/a/0413a35d3177ef48

+0

這是1小時內的第二個MVP問題 – 2014-11-06 13:07:17

+0

@LightnessRacesinOrbit什麼是MVP? – 2014-11-06 13:46:11

+0

@NeilKirk:http://en.wikipedia.org/wiki/Most_vexing_parse – 2014-11-06 13:56:58

回答

2

這是一個讓人頭疼的解析的一個例子 - 函數聲明,在你期望的目的。

試試這個:

map<int, int, C> mymap((C(m))); 
1
map<int, int, C> mymap(C(m)); 

在這種mymap中作爲一個功能。將其更改爲

map<int, int, C> mymap((C(m))); 
+0

但是m在這裏是一個對象,而不是一個類型。爲什麼編譯器不明顯? – 2014-11-07 14:35:01

+0

你可以在谷歌的「最煩人的解析」在C + +。有很多文章。 – ravi 2014-11-07 14:36:35

0

在C++ 11也可避免棘手的解析用括號初始化:

map<int, int, C> mymap(C{m}); 

(不過,如果將不同的表現,如果C有一個構造函數C(std::initializer_list<T>)其中map<int, int>將被隱式可轉換爲T,這樣構造函數會被調用)

更新:正如Benjamin Bannier指出的,你可以在任何地方使用括號初始化器:

map<int, int, C> mymap{C{m}}; 

map<int, int, C> mymap{C(m)}; 

在相同的預防措施:C不應該有operator std::pair<const int, int>()

+0

爲什麼只使用它來構建'C',而不是地圖? – 2014-11-06 13:29:55

+0

@BenjaminBannier謝謝,我更新了答案。 – 2014-11-06 13:50:35

相關問題