无法为数组指定显式初始值设定项

时间:2015-01-11 01:06:53

标签: c++ arrays visual-studio visual-studio-2013

为什么要在VS 2013中编译

int main()
{

    int a[3] = { 1, 2, 3 };

    return 0;

}

但这会产生错误

class TestClass
{

    int a[3] = { 1, 2, 3 };

};

我该如何解决?

3 个答案:

答案 0 :(得分:9)

From Bjarne's C++11 FAQ page

  

在C ++ 98中,只能在类中初始化整数类型的静态const成员,并且初始化程序必须是常量表达式。 [...] C ++ 11的基本思想是允许在声明它的类(其类)中初始化非静态数据成员。

问题是,VS2013并没有实现C ++ 11的所有功能,而这只是其中之一。所以我建议你使用的是std :: array(注意额外的大括号):

#include <array>

class A
{
public:
    A() : a({ { 1, 2, 3 } }) {} // This is aggregate initialization, see main() for another example

private:
    std::array<int, 3> a; // This could also be std::vector<int> depending on what you need.
};

int main()
{
    std::array<int, 3> std_ar2 { {1,2,3} };
    A a;

    return 0;
}

cppreference link on aggregate initialization

如果您有兴趣,可以点击on this link,看看在使用已实现此功能的编译器时,您所做的工作是编译的(在本例中为g ++,我已经在clang ++上试过了它也有效。)

答案 1 :(得分:1)

原因:尚未在该版本的Visual C ++中实现。

修复:使用std::array并在每个构造函数中初始化。

答案 2 :(得分:0)

除了使用其他答案建议的std::array之外,您可以使用in this answer描述的方法:在类声明中将数组标记为静态(通常位于头文件中),并在源文件中初始化它。像这样:

<强> test.h:

class TestClass
{
    static int a[3];
};

<强> TEST.CPP:

int TestClass::a[3] = { 1, 2, 3 };

最终,随着MSVC赶上C ++ 11,这应该变得不必要了。