2015-10-24 68 views
2

我正在学习C++,并且遇到问题。我有这样的声明在类的头文件:在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] = { ...};来初始化数组,它有很多工作。我问是否有另一种方法可以更快地做到这一点。

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

+1

您是否必须为VS2013明确设置编译器设置才能启用C++ 11? –

+1

可能重复的[错误:不能指定数组显式初始化](http://stackoverflow.com/questions/23900191/error-cannot-specify-explicit-initializer-for-array) –

+0

@BartoszPrzybylski请阅读我的更新。在问我之前,我已经发现了这个问题,它的解决方案在我的问题上,我问是否有其他解决方案。 – VansFannel

回答

3

继续编译从评论的讨论,并根据这个问题:Workaround for error C2536: cannot specify explicit initializer for arrays in Visual Studio 2013

你可以使用这样的东西,虽然它不如原始数组或数组

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 

一个帮助你总是可以尝试使用向量的向量与初始化列表如下:https://ideone.com/lQ12a4

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

我不知道这是否会在你的编译器上工作,但根据这个:https://msdn.microsoft.com/en-US/library/hh567368.aspx它应该。

+0

该数组是否等价于bgal [3] [3]?在我的代码中,我使用\t代替(i = 0; i <3; i ++){pos13 [i] = pos [0] * bgal [i] [0] + pos [1] * bgal [i ] [1] + pos [2] * bgal [i] [2]; \t} – VansFannel

+0

它相当于,你的代码应该工作,因为std :: array有正确定义的运算符[],但是你将不能直接转换为double [] [] –

+0

我已经在我的头文件中使用过你的代码我得到很多错误。我必须在哪里使用你的代码? – VansFannel

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编译

+0

但是不是在线编译器使用vs 2015? –

+0

如果我在结构B中做什么,我会得到相同的错误信息。 – VansFannel

+0

@VansFannel您是否显示您复制并粘贴了我的示例? –