C ++ Вектор векторов - PullRequest
       26

C ++ Вектор векторов

9 голосов
/ 27 апреля 2010

У меня есть файл заголовка класса с именем 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 ]

18 голосов
/ 27 апреля 2010

В строке return row[row][col]; первым row является int&, а не vector.

Переменная, объявленная во внутренней области видимости, скрывает переменную во внешней области видимости, поэтому компилятор пытается индексировать int, а не vector, чего он явно не может сделать.

Вам следует исправить имена переменных, чтобы они не конфликтовали.

РЕДАКТИРОВАТЬ: Кроме того, хотя полученная ошибка указывает на то, что компилятор находит неправильную row переменную, как указывает А. Леви, у вас также есть проблема с объявлением ваш vector, поэтому, даже если вы исправите имена переменных, если вы действительно объявили vector, как показано здесь, он не скомпилируется. Вложенные шаблоны должны иметь пробелы между символами >, в противном случае компилятор будет читать >> как оператор сдвига вправо, а не как часть объявления шаблона. Это должно быть

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

или

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

Кроме того, поскольку вы делаете это в заголовочном файле, вам нужно будет прикрепить тег std:: к передней части чего-либо из пространства имен std, например vector. Если бы он был в файле cpp, то вы могли бы использовать using namespace std;, но это было бы очень плохо делать в заголовочном файле (так как это загрязнило бы глобальное пространство имен). Без тега std:: или оператора using компилятор не распознает vector.

9 голосов
/ 27 апреля 2010

Вероятно, это не проблема индекса, но вам также нужен пробел между вложенными угловыми скобками в вашем векторе определения типа векторов. Компиляторам C ++ трудно понять разницу между вложенными типами шаблонов и оператором правильного сдвига битов.

Пример:

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

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

vector< vector<int> > yetAgain;     // Best IMHO. 
                                    // Keeps the white space balanced.
4 голосов
/ 27 апреля 2010

Я думаю, вы хотите что-то вроде этого ... (хотя я не могу представить, почему: -))

#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 голосов
/ 06 декабря 2012

Это то, что вам нужно:

return Grid::row[row][col];
1 голос
/ 27 апреля 2010

Мне кажется (хотя вам может потребоваться проверить это самостоятельно, я не чувствую, что пишу тестовое приложение), что проблема заключается в том, что ваш параметр содержит имя row и ваш В классе есть внутренняя переменная row и конфликт имен.

Возможно, вам потребуется указать, какую строку вы используете. Рассмотрим:

return Grid::row[row][col];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...