我有一个名为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
出了什么问题?
答案 0 :(得分:18)
在第return row[row][col];
行中,第一个row
是int&
,而不是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];