cpp使用向量编译错误初始化2-D数组

时间:2014-06-17 10:44:06

标签: c++ vector compilation initialization

我想使用构造函数中的初始化列表初始化二维数组m_field。 就像在这个帖子Creating 2-dimensional vector in class C++中一样,但我得到下面列出的错误。

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 ===|

2 个答案:

答案 0 :(得分:2)

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

应该是

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

不是非常有用的错误消息,我同意......

答案 1 :(得分:0)

您应该调整设计,而不是修复此编译错误。矩形数组通常不应存储为矢量矢量,而应存储为以2D方式索引的单个矢量。您可以使用像Boost.Matrix这样的现有库,或者自己实现它:

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

您可以提供自己的方法来按行和列进行索引以确保安全。这最终会比矢量矢量方法更有效。