以下代码使用XCode 5.0编译,但不是Visual Studio 2013。
#include <vector>
class VectorInit
{
private:
std::vector<int> m_vector{1, 2, 3}; // fails to compile using VS 2013
};
int main()
{
std::vector<int> vector{1, 2, 3};
VectorInit vectorInit;
return 0;
}
这是Visual Studio报告的错误:
Error 1 error C2664: 'std::vector<int,std::allocator<_Ty>>::vector(std::initializer_list<int>,const std::allocator<_Ty> &)' : cannot convert argument 3 from 'int' to 'const std::allocator<_Ty> &' c:\visual studio 2013\projects\vector-init\main.cpp 6 1 vector-init
我还没有找到一个如何在类定义中初始化这样的向量的示例。
哪个编译器正确?
如果语法无效,是在构造函数初始化列表中初始化m_vector的唯一选项吗?
答案 0 :(得分:7)
在类成员初始化中是一个c ++ 11特性,在VS2013中首次亮相。但是当成员是聚合时,编译器会出错并尝试使用复制构造函数。它忽略了构造函数也使用了初始化列表,并尝试仅将参数与常规构造函数参数匹配。
一种解决方法,您可以创建一个临时向量,然后使用该语法移动,直到正确更新编译器。
class VectorInit
{
private:
std::vector<int> m_vector { std::vector<int>{ 1, 2, 5, 7 } };
};
答案 1 :(得分:4)
如何在类定义(C ++ 11)中初始化向量成员变量
你在做什么是正确的。每当您实例化1, 2, 3
时,它都会将数据成员初始化为值VectorInit
。
但是,如果您需要一个需要()
的其他构造函数,那么您需要一种替代语法:
std::vector<int> m_vector = std::vector(5, 42); // five elements set to 42
哪个编译器正确?
语法是有效的C ++,因此非VS编译器是正确的。
如果你的编译器不支持这种类型的初始化,你可以在你的类中添加一个构造函数作为解决方法:
class VectorInit
{
public:
VectorInt() : m_vector{1, 2, 3}{}
private:
std::vector<int> m_vector;
};