Я пытаюсь создать класс 2D-матрицы, который на самом деле является вектором векторов, а оба класса являются шаблонами. Я перегружен подстрочный оператор в вектор учебный класс. Проблема возникает, когда я пытаюсь перегрузить оператор [] в матрица класс с сообщением об ошибке:
ошибка C2440: «возврат»: невозможно преобразовать из «вектора» в «вектор» &’.
Вот код из моих занятий:
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's the error
}
};
Я немного погуглил и нашел те же примеры или перегрузку () вместо []. Я просто не могу понять, почему компилятор не может видеть возвращаемое значение Mat [индекс] в качестве ссылки (которая, я считаю, должна быть ссылкой). При работе с одним вектором оператор индекса работает нормально. Пожалуйста, укажите мне на мою ошибку (ы). Заранее спасибо!
Добавлено: использование нединамического вектора, кажется, решает текущую проблему, но вместо несоответствия типов у меня есть две ошибки компоновщика (неразрешенный внешний символ). Комментируя и декментируя мой код, я обнаружил, что проблема возникает, только если строка vector< vector<h> > Mat;
или же Extend
функция присутствует (это пустой метод из класса vector). Я думаю, что-то связано с вектор конструктор, но я не знаю, что именно не так.
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 для чтения и одну non-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 */
}
Это позволяет читать вектор в постоянных контекстах.
Mat
это vector< vector<h> >*
не vector< vector<h> >
, Therfore, Mat[index]
не звонит vector::operator[]
,
vector< vector<h> > *Mat;
почему у вас есть указатель? Тебе это не нужно. Это должно быть просто vector
из vector<h>
,
vector< vector<h> > Mat;
примечание: это просто соглашение, но используйте прописные имена для аргументов шаблона, в противном случае другие будут вас ненавидеть;)
Спасибо, ребята, моя проблема решена. Чтобы избежать странных ошибок при инициализации матрицы, определенно лучше использовать нединамический вектор, как в примерах выше. Ошибки компоновщика были исправлены с помощью определений функций копирования-вставки в заголовочном файле (от vector.cpp до vector.h). Это можно сделать, включив файл .cpp в заголовочный файл. Странно, но один вектор отлично работал с отдельными файлами, поэтому я никогда не рассматривал это как источник проблемы.