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

bihw5rsg  于 2023-08-07  发布在  其他
关注(0)|答案(3)|浏览(242)

为什么这在VS2013中编译

int main()
{

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

    return 0;

}

字符串
但这给出了误差

class TestClass
{

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

};


我该怎么解决?

de90aj5v

de90aj5v1#

来自Bjarne的C11 FAQ页面:
在C
98中,只有整型的静态常量成员可以在类中初始化,并且初始化器必须是常量表达式。[...] C11的基本思想是允许在声明非静态数据成员的地方(在它的类中)初始化它。
问题是,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++上试过了,它也能工作)时是否能编译。

5t7ly7z5

5t7ly7z52#

原因:尚未在该版本的Visual C++中实现。
修复:使用std::array并在每个构造函数中初始化。

zqry0prt

zqry0prt3#

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

test.h:

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

字符串

test.cpp:

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


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

相关问题