为什么要在VS 2013中编译
int main()
{
int a[3] = { 1, 2, 3 };
return 0;
}
但这会产生错误
class TestClass
{
int a[3] = { 1, 2, 3 };
};
我该如何解决?
答案 0 :(得分:9)
在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,这应该变得不必要了。