2014-06-17 42 views
1

初始化2- d陣列我想初始化2- d陣列m_field使用在構造函數初始化列表。 喜歡這個線程Creating 2-dimensional vector in class C++,但我得到下面列出的錯誤。CPP使用向量編譯錯誤

BoardData.h

#ifndef BOARDDATA_H 
#define BOARDDATA_H 

#include <vector> 

class BoardData 
{ 
    public: 
    /** Default constructor */ 
    BoardData(int rows, int cols); 
    /** Default destructor */ 
    virtual ~BoardData(); 
    protected: 
    private: 
    std::vector< std:vector<int> > m_field; 

}; 


#endif // BOARDDATA_H 

BoardData.cpp

#include "BoardData.h" 

BoardData::BoardData(int rows, int cols) : 
        m_field(rows, std::vector<int>(cols,0)) 
{ 
    //ctor 
} 

BoardData::~BoardData() 
{ 
    //dtor 
} 

編譯器輸出:(gcc版本4.6.3)

BoardData.h|18|error: template argument 1 is invalid| 
BoardData.h|18|error: template argument 2 is invalid| 
BoardData.cpp||In constructor ‘BoardData::BoardData(int, int)’:| 
BoardData.cpp|4|error: expression list treated as compound expression in mem-initializer [-fpermissive]| 
BoardData.cpp|4|warning: left operand of comma operator has no effect [-Wunused-value]| 
BoardData.cpp|4|error: cannot convert ‘std::vector<int>’ to ‘int’ in initialization| 
||=== Build finished: 4 errors, 1 warnings ===| 
+0

提示:這是* *的座標,而不是* *協調,簡稱*座標*,* COORDS *複數。 –

+0

另外'm_row'在這裏完全是多餘的。回到這本書! (因爲這個問題也是由初學者寫的,不要複製你不懂的代碼)。 –

+0

@BartekBanachewicz在沒有m_row的情況下將Q編輯到我之前的迭代中。 – Rob

回答

2
std::vector< std:vector<int> > m_field; 

應該

std::vector< std::vector<int> > m_field; 
       ^

不是一個非常有用的錯誤消息,我同意...

0

而不是修復這個編譯錯誤,你應該調整你的設計。一個矩形陣列通常不應該被存儲爲向量的向量,而是作爲一個單獨的向量,您將以2D方式進行索引。您可以像使用Boost.Matrix現有的庫這一點,或者實現它自己:

m_field(rows*cols) // initialize 
m_field[row + rows*col] // index 

您可以通過行和列的安全提供自己的方法來索引。這最終將比矢量矢量方法更有效。

+0

我並沒有要求優化。我明確地問爲什麼我得到編譯錯誤。 – Rob

+0

我並不完全同意被黑了的一維陣列普遍「更好」的建議。如果你的代碼簡單明瞭,並且符合你的性能要求,那就沒問題。根據我的經驗,Clarity擊敗了不必要的優化。 –

+0

@MattMcNabb:我大多數人都同意你的看法,但考慮矢量矢量代表一個鋸齒形的二維數組,而不是一個矩形的矢量。從概念上講,將2D索引分配到單個分配中會更簡潔(開銷更小)。 –