У меня есть заголовочный файл класса по имени 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
Что идет не так, как надо?
В строке 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
компилятор не распознает вектор
.
Я думаю, вам нужно что-то вроде этого ... (хотя я не могу представить, почему: -))
#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;
}
Вероятно, это не проблема индекса, но вам также понадобится пробел между вложенными угловыми скобками в объявлении типа вектора векторов. Компиляторам C ++ сложно определить разницу между вложенными типами шаблонов и оператором сдвига правого бита.
Пример:
vector<vector<int> > vec2d; // Good.
vector<vector<int>> anotherVec2d; // Bad!
vector< vector<int> > yetAgain; // Best IMHO.
// Keeps the white space balanced.
Мне кажется (хотя вам может потребоваться проверить это самостоятельно, мне не хочется писать тестовое приложение), что проблема связана с тем, что ваш параметр содержит именованную строку
, а ваш класс имеет внутреннюю переменную row
, и существует конфликт имен.
Возможно, вам потребуется указать, какую строку вы используете. Учтите:
return Grid::row[row][col];