【问题标题】:No appropriate default constructor available [duplicate]没有合适的默认构造函数可用[重复]
【发布时间】:2011-12-22 05:49:58
【问题描述】:

我的 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:\program files\microsoft visual studio 10.0\vc\include\map(210) : 在编译类模板成员函数 'Timezone &std::map<_kty>::operator [](const std ::basic_string<_elem> &)'

我的问题是,为什么?为什么地图试图构造一个 Timezone 对象?如果我总是将完全成形的对象放入我的地图中,为什么还需要它?特别是初始化地图时为什么会出现这个错误?

【问题讨论】:

    标签: c++ visual-c++ stl


    【解决方案1】:

    您可能正在使用mapoperator[]确实需要默认构造函数(如果不需要,它将如何处理密钥不存在的情况在地图上?)。如果您改用insert,您可能可以不提供一个(我不记得标准是否需要所有地图的默认构造函数,或者仅当您使用该运算符时) .

    【讨论】:

    • +1 好东西。请注意,对于带有 explicit Foo::Foo(int) 唯一构造函数和显式复制构造函数的 std::map&lt;int, Foo&gt;,您始终可以说 m.insert(std::make_pair(1, 5));,但在 C++11 中只能说 m.insert(std::make_pair(1, Foo(5)));
    【解决方案2】:

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

    【讨论】:

    • 这听起来不对。没有对象是“不可见的”创建的。地图仅在您明确需要时创建对象。
    • 你是对的。我完全没有说我的意思。 @Mark-B 做到了。
    猜你喜欢
    • 2013-10-14
    • 2016-04-22
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多