【问题标题】:How should one initialise this member vector in C++11-style?应该如何以 C++11 风格初始化这个成员向量?
【发布时间】:2014-10-23 12:21:55
【问题描述】:

我有一个类的成员变量是std::vector<double>。我想在类的初始化列表中初始化它。我试过下面的代码

MyClass::MyClass()
  : m_myMemberVector( { 1.0, 2.0 } )
{...}

但编译器将此解释为std::vector(itBegin, itEnd) 构造函数。我看过这个问题error: ‘double’ is not a class, struct, or union type,它指出了输入迭代器的问题,但没有提供解决方案。

我有一个在构造函数主体中使用 BOOST 的工作实现,但如果可能的话,我宁愿在初始化列表中执行此操作。有没有什么优雅的方法可以使用 C++11 风格的初始化构造一个包含两个双精度的向量?

【问题讨论】:

  • 听起来像一个错误。你用的是哪个编译器?
  • 你确定构造函数被选中了吗?您可以发布代码来证明这一点吗?在任何情况下,请尝试省略(),即m_myMemberVector{ 1.0, 2.0 }
  • 去掉大括号m_myMemberVector{ 1.0, 2.0 }
  • 等等:你启用 C++11 了吗?仍然得到迭代器错误?

标签: c++ c++11 vector initialization


【解决方案1】:

std::initializer_list<double>{ 1.0, 2.0 } 而不是{ 1.0, 2.0 } 可能会起作用,就像删除{ 1.0, 2.0 } 周围的() 一样。

这很可能是您的编译器中的一个错误,因此使事情更明确可能会有所帮助。

另一种可能性是 m_myMemberVector 实际上不是 std::vector<double>,或者您使用的标准库未启用 C++11。

【讨论】:

    【解决方案2】:

    简单的解决方案是正确的:C++11 没有正确启用。我看到了表单的编译器输出

    MyClass.cxx:5:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
    

    并假设这意味着 C++11 支持将“默认启用”!显式使用 -std=c++11 重新编译按预期工作。

    有一个答案暗示了这一点,我想接受,但它似乎已被删除。感谢所有提出这一点的 cmets。

    【讨论】:

    • 仅供参考,您不必像目前那样接受其他答案。例如,您可以接受这个,您自己的,在特定超时后回答。
    • 另外,[enabled by default] 指的是警告。其他警告显示为[-Wfoobar]。并且始终使用-Wall -Wextra -Werror(或至少-Werror)进行编译,如果您正在编写新代码(因此可以遵守某些质量标准),这样可以避免很多错误。
    • 感谢乔纳斯·维利奇。我想这在解释编译器输出时有点 PEBKAC !实际上,我通常在自己的项目中使用这些标志进行编译,但在这种情况下,我无法控制 Makefile。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2012-10-03
    • 2012-06-24
    相关资源
    最近更新 更多