2015-10-24 108 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您是否顯示您複製並粘貼了我的示例? –