Я пытаюсь сделать 2D-матричный класс, который на самом деле является вектором векторов, и оба класса являются шаблонами. Я перегрузил оператор индекса в векторном классе. Проблема возникает, когда я пытаюсь перегрузить оператор [] в классе матрицы с сообщением об ошибке: ошибка C2440: 'return': не может преобразовать из 'vector' в 'vector &'. Вот код из моих классов:
template <typename t>
class vector
{
private:
t *Mem;
int vectsize;
public:
vector<t> (int _vectsize = 0);
//some other methods here
t& operator[](int index)
{
return Mem[index];
}
};
А также
template <typename h>
class matrix
{
private:
int dim;
vector< vector<h> > *Mat;
public:
matrix<h> (int _dim = 0);
matrix<h> (const matrix & _copy);
vector<h>& operator[](int index)
{
return Mat[index]; //Here the error
}
};
Я сделал несколько поисковых запросов и нашел те же примеры или перегрузку() вместо []. Я просто не могу понять, почему компилятор не может увидеть возвращаемое значение Mat [index] в качестве ссылки (которое, я считаю, должно быть ссылкой). При работе с одним вектором оператор индекса работает очень хорошо. Пожалуйста, укажите мне мою ошибку. Заранее спасибо!
Добавлено: использование нединамического вектора, похоже, решает текущую проблему, но вместо несоответствия типов у меня есть две ошибки компоновщика (неразрешенный внешний символ). Комментируя и разлагая код, я обнаружил, что проблема возникает только в том случае, если vector< vector<h> > Mat;
линии vector< vector<h> > Mat;
или Extend
присутствует (это пустой метод из вектора класса). Я предполагаю, что что-то связано с конструктором векторов, но я не знаю, что именно не так.
template <typename t> //vector constructor
vector<t>::vector(int _vectsize)
{
vectsize = _vectsize;
Mem = new t[vectsize];
for (int i=0; i<vectsize; i++)
Mem[i] = 0;
}
В matrix.h (это еще не в отдельных файлах):
matrix<h> (int _dim = 0) : Mat(_dim)
{
dim = _dim;
for (int i=0; i<dim; i++)
Mat[i].Extend(dim-i);
}
Мне бы хотелось услышать любые предложения, если это возможно.
Mat
- указатель на вектор. Нет причин для динамического выделения вектора, просто используйте vector<vector<H>> Mat;
,
Кроме того, operator[]
имеет обычно две перегрузки: один const для чтения и один неконстантный для записи:
//Read overload
const T& operator[](std::size_t index) const
{
return /* blah blah */
}
//Write overload
T& operator[](std::size_t index)
{
return /* blah blah */
}
Это позволяет считывать вектор в контекстах const.
Спасибо, ребята, моя проблема решена. Чтобы избежать странных ошибок при инициализации матрицы, определенно лучше использовать нединамический вектор, как в приведенных выше примерах. Ошибки компоновщика были исправлены с помощью определений функций копирования в файле заголовка (от vector.cpp до vector.h). Это можно сделать, включив файл.cpp в заголовочный файл. Странный, но единственный вектор отлично работал с разделенными файлами, поэтому я никогда не рассматривал это как источник проблемы.
vector< vector<h> > *Mat;
почему у вас есть указатель? Вам это не нужно. Он должен быть просто vector
vector<h>
.
vector< vector<h> > Mat;
note: это просто соглашение, но используйте имена в верхнем регистре для аргументов шаблона, иначе другие вас будут ненавидеть;)
Mat
- vector< vector<h> >*
, а не vector< vector<h> >
. Поэтому Mat[index]
не вызывает vector::operator[]
.