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失败。解决办法,即是为类添加默认的构造函数。