6

以下代码使用 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 是唯一的选择吗?

4

2 回答 2

8

类成员初始化是在 VS2013 中首次亮相的 c++11 功能。但是当成员是一个聚合时,编译器有问题并尝试使用复制构造函数。它也忽略了带有初始化列表的构造函数,并尝试仅将参数与常规构造函数参数匹配。

一种解决方法,您可以创建一个临时向量,然后使用该语法移动,直到正确更新编译器。

class VectorInit
{
private:
    std::vector<int> m_vector { std::vector<int>{ 1, 2, 5, 7 } };
};
于 2014-02-05T10:43:43.430 回答
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;
};
于 2014-02-05T09:27:26.993 回答