用C ++初始化二维数组

时间:2015-10-24 15:45:23

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

我正在学习C ++而且我遇到了问题。我在类头文件中有这个声明:

double bgal[3][3] =
    { { -0.066988739415,-0.872755765852,-0.483538914632 },
    { 0.492728466075,-0.450346958020, 0.744584633283 },
    { -0.867600811151,-0.188374601723, 0.460199784784 } };

使用Visual Studio 2015编译很好,但使用Visual Studio 2013它无法编译。我收到这条消息:

cannot specify explicit initializer for arrays

我认为问题与Visual Studio 2013不支持C ++ 11和编译器错误C2536有关。

我试图在类构造函数中移动该初始化,但它不起作用。这样:

MyClass::MyClass() : bgal { { -0.066988739415, -0.872755765852, -0.483538914632 }, 
                            { 0.492728466075, -0.450346958020, 0.744584633283 },
                            { -0.867600811151, -0.188374601723, 0.460199784784 } }

但它不起作用。

有什么建议吗?也许我不能使这个矢量恒定或静止,或者......

我尝试了bgal[0][0] = { ...}; bgal[0][1] = { ...};,但这是很多工作。

这不是问题Error: cannot specify explicit initializer for array的重复,因为该问题询问了一维数组,它提供了一个解决方案,用bgal[0][0] = { ...}; bgal[0][1] = { ...};初始化数组,这是一项很多工作。我问是否还有其他方法可以更快地完成它。

在寻找可能的重复问题之前,请仔细阅读该问题。

2 个答案:

答案 0 :(得分:3)

继续根据评论进行讨论,并根据这个问题:file a feature request

你可以使用这样的东西,但它不像原始数组或数组那样漂亮

array<array<double, 3>, 3> a({
    array<double,3>({ -0.066988739415,-0.872755765852,-0.483538914632 }),
    array<double,3>({ 0.492728466075,-0.450346958020, 0.744584633283 }),
    array<double,3>( { -0.867600811151,-0.188374601723, 0.460199784784 }) });

为了使它更漂亮,你总是可以定义一个辅助宏

#define DD array<double,3>

array<array<double, 3>, 3> a({
    DD({ -0.066988739415,-0.872755765852,-0.483538914632 }),
    DD({ 0.492728466075,-0.450346958020, 0.744584633283 }),
    DD( { -0.867600811151,-0.188374601723, 0.460199784784 }) });
#undef DD

您可以尝试使用带有初始化列表的向量向量,如下所示:Workaround for error C2536: cannot specify explicit initializer for arrays in Visual Studio 2013

vector<vector<double> > a{
    { -0.066988739415,-0.872755765852,-0.483538914632 },
    { 0.492728466075,-0.450346958020, 0.744584633283 },
    { -0.867600811151,-0.188374601723, 0.460199784784 } };

我不知道这是否适用于你的编译器,但根据这个:https://ideone.com/lQ12a4它应该。

答案 1 :(得分:0)

这是一个演示程序,显示数组成员初始化的数组类型。您可以选择允许使用编译器初始化数组的方法。:)

#include <iostream>

struct A
{
    double bgal[3][3] 
    { { -0.066988739415,-0.872755765852,-0.483538914632 },
      { 0.492728466075,-0.450346958020, 0.744584633283 },
      { -0.867600811151,-0.188374601723, 0.460199784784 } 
    };    
};

struct B
{
    B() : bgal { { -0.066988739415,-0.872755765852,-0.483538914632 },
                 { 0.492728466075,-0.450346958020, 0.744584633283 },
                 { -0.867600811151,-0.188374601723, 0.460199784784 } }
    {

    }

    double bgal[3][3];
};

int main()
{
    A a;
    B b;

    for ( const auto &row : a.bgal )
    {
        for ( double x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;

    for ( const auto &row : b.bgal )
    {
        for ( double x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }
}

程序输出

-0.0669887 -0.872756 -0.483539 
0.492728 -0.450347 0.744585 
-0.867601 -0.188375 0.4602 

-0.0669887 -0.872756 -0.483539 
0.492728 -0.450347 0.744585 
-0.867601 -0.188375 0.4602 

它是使用在线MS编译器编译的