没有合适的默认构造函数可用

问题描述:

我在我的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对象?如果我总是将完全形成的物体放入我的地图,为什么还需要它?特别是,当我初始化地图时为什么会出现这个错误?

你可能会使用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)));'。 –

当你使用[]访问结构时,地图对象需要一个默认的构造函数(我以前的解释过于复杂以至于无意义 - 抱歉)。见:Why does the C++ map type argument require an empty constructor when using []?

+0

这听起来不对。没有对象是“无形”创建的。当您明确需要时,地图只会创建一个对象。 –

+0

你说得对。我完全没有说出我的意思。 @ Mark-B做到了。 – drdwilcox