C ++矢量矢量

时间:2010-04-26 22:59:53

标签: c++ vector

我有一个名为Grid.h的类头文件,其中包含以下2个私有数据对象:

vector<int> column;
vector<vector<int>> row;

一个公共方法,其原型在Grid.h中是这样的:

int getElement (unsigned int& col, unsigned int& row);

上面提到的函数的定义在Grid.cpp中定义:

int getElement (unsigned int& col, unsigned int& row)
{
    return row[row][col] ;
}

当我运行程序时,我收到此错误:

error C2109: subscript requires array or pointer type

出了什么问题?

5 个答案:

答案 0 :(得分:18)

在第return row[row][col];行中,第一个rowint&,而不是vector

在内部作用域中声明的变量是在外部作用域中隐藏变量,因此编译器正在尝试索引int而不是vector,这显然是不能的。< / p>

您应该修改变量名称,以免它们发生冲突。

编辑:此外,虽然你得到的错误表明编译器发现错误的row变量,正如A. Levy指出的那样,你也遇到了问题你vector的声明,所以即使你修改了变量名,如果你确实声明了这里所示的vector,它也不会编译。嵌套模板需要>符号之间的空格,否则编译器将读取>>作为右移运算符而不是模板声明的一部分。它必须是

std::vector<std::vector<int> > row;

std::vector< std::vector<int> > row;

此外,当您在头文件中执行此操作时,您将需要在std命名空间的前面添加std::标记 - 例如vector。如果它在cpp文件中,那么你可以使用using namespace std;,但这在头文件中会非常糟糕(因为它会污染全局命名空间)。如果没有std::标记或using语句,编译器将无法识别vector

答案 1 :(得分:9)

这可能不是索引问题,但您还需要向量类型声明向量中的嵌套尖括号之间的空格。 C ++编译器很难说明嵌套模板类型和正确的位移运算符之间的区别。

示例:

vector<vector<int> >  vec2d;        // Good.

vector<vector<int>>   anotherVec2d; // Bad!

vector< vector<int> > yetAgain;     // Best IMHO. 
                                    // Keeps the white space balanced.

答案 2 :(得分:4)

我想你想要这样的东西......(虽然我无法想象为什么: - ))

#include <vector>
#include <iostream>

using namespace std;

typedef vector<int> row;
typedef vector<row> matrix;

matrix mat(2,2);

int getElement (unsigned int ri, unsigned int ci)
{
    return mat[ri][ci] ;
}

int main() {

    mat[1][0] = 1234;
    cout << getElement(1,0) << endl;

    return 0;
}

答案 3 :(得分:3)

这就是你需要的:

return Grid::row[row][col];

答案 4 :(得分:1)

在我看来(虽然您可能需要自己验证这一点,但我不想编写测试应用程序)问题来自于您的参数包含名为row的事实并且您的类有一个内部变量row,并且存在命名冲突。

您可能需要限定您正在使用的行。考虑:

return Grid::row[row][col];