C++ C++;向量中的向量

C++ C++;向量中的向量,c++,vector,C++,Vector,我有一个名为Grid.h的类头文件,其中包含以下2个私有数据对象: vector<int> column; vector<vector<int>> row; 上述函数的定义在Grid.cpp中定义为: int getElement (unsigned int& col, unsigned int& row) { return row[row][col] ; } 当我运行该程序时,会出现以下错误: error C2109: subsc

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

vector<int> column;
vector<vector<int>> row;
上述函数的定义在Grid.cpp中定义为:

int getElement (unsigned int& col, unsigned int& row)
{
    return row[row][col] ;
}
当我运行该程序时,会出现以下错误:

error C2109: subscript requires array or pointer type

出了什么问题?

返回行[row][col]中
第一行
整数&
,而不是
向量

内部作用域中声明的变量将外部作用域中的变量隐藏起来,因此编译器试图索引
int
,而不是
vector
,这显然是无法做到的

您应该修复变量名,使它们不会冲突

编辑:此外,正如A.Levy指出的,虽然您得到的错误表明编译器找到了错误的
变量,但您的
向量
的声明也有问题,因此即使您修复了变量名,如果您确实声明了
向量
,如图所示,它不会编译。嵌套模板在
>
符号之间需要空格,否则编译器将作为右移运算符而不是模板声明的一部分来读取
>
。这是必须的

std::vector<std::vector<int> > row;
std::向量行;

std::vectorrow;

此外,当您在头文件中执行此操作时,您需要在std名称空间中任何内容的前面加上
std::
标记,例如
vector
。如果它在cpp文件中,那么您可以使用
使用名称空间stdstd::
标记或
using
语句,编译器将无法识别
向量

,这可能不是索引问题,但在向量类型声明中的嵌套尖括号之间也需要一个空格。C++编译器很难区分嵌套模板类型和正确的位移位操作符之间的区别。 例如:

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

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

vector< vector<int> > yetAgain;     // Best IMHO. 
                                    // Keeps the white space balanced.
vectorvec2d;//好。
向量另一个向量2d;//糟糕!
vectoryetAgain;//最好的IMHO。
//保持空白平衡。
在我看来(尽管您可能需要自己验证这一点,但我不想编写一个测试应用程序),问题来自这样一个事实:您的参数包含一个命名的
,而您的类有一个内部变量
,并且存在命名冲突

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

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

我想你想要这样的东西。。。(尽管我无法想象为什么:-)

#包括
#包括
使用名称空间std;
typedef向量行;
向量矩阵;
矩阵mat(2,2);
int getElement(无符号int ri,无符号int ci)
{
返回矩阵[ri][ci];
}
int main(){
mat[1][0]=1234;
cout这是您需要的:

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

有什么理由通过引用获取这些参数吗?如果有的话,它们应该是一个常量引用,但是除非您需要,否则基本类型通常不应该通过引用传递。还有,为什么有两个向量?向量中的向量都是,您的
向量只是其他东西。或者返回此->行[row][col col]我将private:部分中的行和列重命名为水平和垂直。我现在得到错误“水平:未声明的标识符”和“垂直:未声明的标识符”@xbonez:为什么有两个向量?我以为你想要一个向量?(给出一个2D向量)我真希望我能凭良心把这句话改过来,因为它在技术上是正确的。这只是解决问题的错误方法。@GMan:我制作了另一个vector的vector列,所以当我想向行添加一个vector时,我可以执行row。向后推(列)。当我在行上使用push back时,我必须传递一个向量作为参数,不是吗?@KevenK,两个符号之间的空格阻止编译器将它们视为单个运算符。我希望我可以对您的注释进行向下投票。在这种情况下,空格非常重要。解析器使用maximal munch进行解析,因此它可以获取最大的标记。这就是这意味着在
vector
中,它将把
>
解析为移位运算符,而不是模板声明的一部分。您需要额外的空间来向编译器表明您正在声明一个模板,而不是一个包含移位运算符的表达式。这一点现在已经更改。如果您使用的是当前编译器,您可能可以写“向量”得到你想要的。还不是标准的,但VS2010、g++和几乎可以肯定的其他人现在都支持它。@Mark/Jonathan:如果我的评论不能保证在每个编译器上都是正确的,我深表歉意。我的评论有点被纠正了,尽管这听起来确实像是某些编译器的一个缺点。我不能说我使用了太多不同的编译器我个人认为,它至少在VC++ 2005(可能更早)就已经与微软C++编译器一起使用了。所以,实际上,它是语言的缺陷,而不是编译器。一些编译器作者选择打破标准以绕过这个缺陷。(如果这是您使用的唯一编译器,但会影响可移植性并导致问题,那么这将非常方便),而其他人则选择遵循该标准。幸运的是,下一个标准修复了该语言中的这一缺陷,使其不再成为问题。但我真的不会说这是编译器中的缺陷,因为当前标准就是这样。如果我将向量的名称更改为“水平”和“垂直”,则会导致未声明每一个的标识符错误或者你只需执行“this->row[row][col]”就可以了。啊哈!!是的,这似乎是一个更好的方法。我没有想到。这样我就不需要嵌套向量了。非常感谢。我将这样使用。这个答案仍然是嵌套向量,只是在C-st下
return Grid::row[row][col];
#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;
}
return Grid::row[row][col];