无法为数组指定显式初始化程序

3
这段代码为什么可以在 VS 2013 中编译通过?
int main()
{

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

    return 0;

}

但是这会导致错误。
class TestClass
{

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

};

我该怎么修复它?

它给出了什么错误? - Scott Hunter
据我所知,这是C++11的一个特性,在VS2013发布时Microsoft还没有实现它。它可以使用g++clang++编译。 - Borgleader
@abalter,因为前者一直存在于语言中“永远”,而后者是一个较新的功能,尚未在VS中实现。有关解决方法,请参见Cheers的答案。 - Borgleader
@Borgleader 那么区别在于在类范围内初始化还是在方法中初始化吗? - abalter
可能是 无法为数组指定显式初始化程序 的重复问题。 - waldyrious
显示剩余3条评论
3个回答

9

来自Bjarne的C++11 FAQ页面:

在C++98中,只有整型的静态常量成员可以在类内初始化,并且初始值必须是一个常量表达式。... 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链接

如果您感兴趣,可以点击此链接查看在实现了这个特性的编译器(例如g++和clang++)中使用您所做的内容是可以编译通过的。


1

为什么:在这个版本的Visual C++中还没有实现。

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


1
您能否用一个明确的例子来进一步解释吗?我尝试了几种方法,但还没有找到正确的方法。 - abalter
例如,我尝试了 int a = new int[3] {1, 2, 3}; - abalter
@abalter:在C++中不需要使用new,那是Java的东西。 - Cheers and hth. - Alf

0

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

test.h:

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

test.cpp:

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

随着MSVC的逐步更新,最终这将变得不再必要,以达到C++11的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接