C ++ Двойная перезапись: невозможно преобразовать тип 'в' тип & '

0

Я пытаюсь сделать 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);
    }

Мне бы хотелось услышать любые предложения, если это возможно.

Теги:
operator-overloading

4 ответа

2

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.

0

Спасибо, ребята, моя проблема решена. Чтобы избежать странных ошибок при инициализации матрицы, определенно лучше использовать нединамический вектор, как в приведенных выше примерах. Ошибки компоновщика были исправлены с помощью определений функций копирования в файле заголовка (от vector.cpp до vector.h). Это можно сделать, включив файл.cpp в заголовочный файл. Странный, но единственный вектор отлично работал с разделенными файлами, поэтому я никогда не рассматривал это как источник проблемы.

0
vector< vector<h> > *Mat;

почему у вас есть указатель? Вам это не нужно. Он должен быть просто vector vector<h>.

vector< vector<h> > Mat;

note: это просто соглашение, но используйте имена в верхнем регистре для аргументов шаблона, иначе другие вас будут ненавидеть;)

  • 0
    Да ладно! :-) Я просто новичок. Похоже, мне нужно изучить все эти этические правила.
  • 0
    это не имеет ничего общего с этикой. и это не имеет ничего общего с языком. компилятору (как вы можете видеть) все равно. Мы заботимся. легче читать то, что было отформатировано знакомым способом. вот и все.
0

Mat - vector< vector<h> >*, а не vector< vector<h> >. Поэтому Mat[index] не вызывает vector::operator[].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню