【问题标题】:How to initialise a vector member variable in the class definition?如何在类定义中初始化一个向量成员变量?
【发布时间】:2014-03-01 15:23:57
【问题描述】:

以下代码使用 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 的选项?

【问题讨论】:

  • visual 2013 在类初始化中的非静态成员在每种情况下都不是正确的,例如,仅通过查看复制构造函数聚合失败。 initializer_list ctor 也是。
  • @galop1n 抱歉,我不太明白您的评论。请你澄清一下。
  • 类成员初始化是一个 c++11 特性,在 VS2013 中首次亮相。但是当成员是聚合时,编译器有问题,并尝试使用复制构造函数。它也忽略了带有初始化列表的构造函数,并尝试仅将参数与常规构造函数匹配。
  • @galop1n 感谢您的澄清。

标签: c++ c++11 xcode5 visual-studio-2013 uniform-initialization


【解决方案1】:

如何在类定义中初始化一个vector成员变量(C++11)

你所做的是正确的。每当您实例化VectorInit 时,它都会将数据成员初始化为具有值1, 2, 3

但是,如果您需要一个需要() 的不同构造函数,那么您需要另一种语法:

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;
};

【讨论】:

  • 为什么不私有(一个向量构造函数需要一个initializer_list)?
  • @DieterLücking 这是另一种选择,尽管它解决了不同的问题(实际上就像我的第二个示例)。
  • @juanchopanza VS 2013 编译器也不接受这种语法。
【解决方案2】:

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

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

class VectorInit
{
private:
    std::vector<int> m_vector { std::vector<int>{ 1, 2, 5, 7 } };
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多