2013-10-01 2 views
0

Я пытаюсь написать перегрузку оператора для связанного списка, который будет занимать правую часть + и объединить этот список в список слева.Оператор C++ + перегрузка по одному связанному списку

декларация Класс:

List<T>& operator+(const List<T>& right); 

Метод:

template <typename T> 
List<T>& List<T>::operator+(const List<T>& right){ 
    List result(*this); 
    while(right->next != NULL){ 
     result->push_back(right->data); 
    } 
    return list; 
} 

Driver:

mylist + mylist2; //both list objects already created. 

Сообщение об ошибке:

Error: The operation "List<std::string>* + List<std::string>*" is illegal. 

Я не уверен, почему я получаю ошибку времени компиляции. Моя логика состоит в том, чтобы взять каждый элемент списка с правой стороны и просто нажать его в конец списка слева. Мысли?

+2

Если вы хотите объединиться с существующим списком, было бы более полезно перегрузить '+ ='. Оператор '+' должен возвращать новый список. Но у вас две большие ошибки: вы возвращаете ссылку на локальную переменную, и, похоже, вы пытаетесь добавить два указателя. – juanchopanza

+1

Судя по сообщению об ошибке, 'mylist1' и' mylist2' не являются 'List', это указатели. И вы не можете добавить указатели. – molbdnilo

ответ

1

Точная ошибка, о которой вы сообщаете, вероятно, находится в коде, который вы не указали, но важно указать, что operator+ не должен возвращать ссылку. Вам нужен оператор-член

List<T> operator+(const List<T>& right); 

или версии, не являющееся членом,

template <typename T> 
List<T> operator+(const List<T>& lhs, const List<T>& rhs); 

Вы можете осуществить либо с точки зрения оператора член +=, где вы добавляете элементы lhs к *this и вернуть *this по ссылке. Логика в вашем примере является некорректной, я оставляю это до вас, чтобы исправить это, но это общая форма:

List<T>& operator+=(const List<T>& rhs) 
{ 
    // append elements from rhs into *this 
    .... 
    return *this; 
} 

Ваш operator+ реализация становится довольно просто:

template <typename T> 
List<T> operator+(const List<T>& lhs, const List<T>& rhs) 
{ 
    List<T> tmp = lhs; 
    tmp += rhs; 
    return tmp; 
} 
+0

Итак, чтобы понять, что мне нужно перегрузить как оператор +, так и оператор + =, чтобы правильно объединить два списка? – user1822789

+0

Получил это работу, спасибо за предложения. – user1822789

+0

@ user1822789 у вас нет * have * для реализации 'operator +' с помощью 'operator + =', но обычно имеет смысл сделать это таким образом. – juanchopanza

 Смежные вопросы

  • Нет связанных вопросов^_^