2011-11-04 38 views
8

我在我的C收到以下錯誤++程序:沒有合適的默認構造函數可用

1>   c:\users\thom\documents\cworkspace\barnaby\barnaby\timezone.cpp(14) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled 

這是倒在錯誤堆棧,但指向此行的代碼位:

static std::map<const std::string, Timezone> timezoneMap; 

原因是Timezone有一個相當複雜的構造函數,但沒有默認的構造函數。這裏的誤差的那部分:

c:\program files\microsoft visual studio 10.0\vc\include\map(215): error C2512: 'Timezone::Timezone' : no appropriate default constructor available 

1> C:\程序Files \ Microsoft的Visual Studio 10.0 \ VC \包括\地圖(210):在編譯類模板的成員函數「時區&的std ::地圖< _Kty,_Ty> :: operator [](const std :: basic_string < _Elem,_Traits,_Ax> &)'

我的問題是,爲什麼?爲什麼地圖試圖構造一個Timezone對象?如果我總是將完全形成的物體放入我的地圖,爲什麼還需要它?特別是,當我初始化地圖時爲什麼會出現這個錯誤?

回答

12

你可能會使用mapoperator[]需要默認的構造函數(如果沒有,會是怎樣處理這種情況的關鍵並不在地圖上存在的情況?)。如果您使用insert而不是可能能夠逃脫不提供一個(我不記得標準是否需要所有地圖的默認構造函數,或者只是當您使用該運算符時)。

+1

+1好東西。請注意,對於'顯式Foo :: Foo(int)'唯一的構造函數和顯式拷貝構造函數,'std :: map ',您總是可以說'm.insert(std :: make_pair(1,5)); ',但你只能在C++ 11中說'm.insert(std :: make_pair(1,Foo(5)));'。 –

相關問題