error C2512: “Foo”: 没有合适的默认构造函数可用

清泛原创
错误信息如下:
C:\Program Files\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(601) : error C2512: “Foo”: 没有
合适的默认构造函数可用
        C:\Program Files\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(600): 编译类 模板 成员函数
“void std::allocator<_Ty>::construct(_Ty *)”时
        with
        [
            _Ty=Foo
        ]
        C:\Program Files\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(751): 参见对正在编译的函数
 模板 实例化“void std::allocator<_Ty>::construct(_Ty *)”的引用
        with
        [
            _Ty=Foo
        ]
        C:\Program Files\Microsoft Visual Studio 11.0\VC\INCLUDE\type_traits(743): 参见对正在编译的
类 模板 实例化“std::allocator<_Ty>”的引用
        with
        [
            _Ty=Foo
        ]
        C:\Program Files\Microsoft Visual Studio 11.0\VC\INCLUDE\vector(655): 参见对正在编译的类 模
板 实例化“std::is_empty<_Ty>”的引用
        with
        [
            _Ty=std::allocator<Foo>
        ]
        prog26.cpp(15): 参见对正在编译的类 模板 实例化“std::vector<_Ty>”的引用
        with
        [
            _Ty=Foo
        ]
出错代码:
#include <stdio.h>
#include <vector>
using namespace std;
  
//顺序容器举例
class Foo
{
public:
    Foo(int i):ival(i){}
private:
    int ival;
};
int main(int argc, char *argv[])
{
    vector<Foo> empty;
    vector<Foo> bad(10);
    vector<Foo> ok(10,1);
    return 0;
}

解决办法: 实际上根据c++ primer第四版解释构造空的vector时是不调用对象的构造函数的,但是这里用于 x86 的 Microsoft (R) C/C++ 优化编译器 17.00.61030编译显式错误,可能编译器版本不同结果有所不同。

主要看下面的bad(10)这一行,也同样会报错。错误的原因在于类类型对象没有默认的构造函数,因此无法正确初始化,构造vector失败。解决办法,即是为类添加默认的构造函数。

error C2512 默认构造函数

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部