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

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

Что идет не так, как надо?

9
задан xbonez 26 April 2010 в 22:59
поделиться

4 ответа

В строке return row [row] [col]; первая строка - это int & , а не вектор .

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

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

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

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

или

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

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

19
ответ дан 4 December 2019 в 06:40
поделиться

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

#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;
}
4
ответ дан 4 December 2019 в 06:40
поделиться

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

Пример:

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

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

vector< vector<int> > yetAgain;     // Best IMHO. 
                                    // Keeps the white space balanced.
8
ответ дан 4 December 2019 в 06:40
поделиться

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

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

return Grid::row[row][col];
1
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: