0

以下のように、「+」演算子と「=」演算子をオーバーロードしようとしました。

template<class T>
class LinkedList {     
 public:
  LinkedList();
  LinkedList(const LinkedList<T> &list);        //Copy Constructor! Allocating new memory!
  ~LinkedList();
  void PushNode(T new_data);
  void Delete(LinkedNode<T> *pnode);
  bool CopyDelete(LinkedNode<T> *pnode);
  bool CopyDeleteMiddle(); 
  void Show();
  int get_length();
  void Clear();
  LinkedList<T> operator+(LinkedList<T> &list);  //Overloading '+' operator
  LinkedList<T> &operator=(LinkedList<T> &list); //Overloading '=' operator
  LinkedNode<T> *head;
  LinkedNode<T> *tail;

 private:
  int length;
};

template <class T>
LinkedList<T>& LinkedList<T>::operator=(LinkedList<T> &list)
{
  if (&list != this) {
    Clear();
    LinkedNode<T> *pnode = list.head;
    while(pnode)
    {
      PushNode(pnode->data);
      pnode = pnode->next;
    }
  }
  return *this;
}

template <class T>
LinkedList<T> LinkedList<T>::operator+(LinkedList<T> &list)
{
  int carry = 0;
  LinkedList<T> sum_list;
  LinkedNode<T> *pnode = list.head;
  LinkedNode<T> *pnode_this = head;
  if (!pnode || !pnode_this)
    throw("Invalid list!");

  T digit, digit_this, digit_sum;
  while(pnode || pnode_this)
  {
    if (!pnode) {
      digit = 0;
      digit_this = pnode_this->data;
      pnode_this = pnode_this->next;
    } else if (!pnode_this) {
      digit = pnode->data;
      digit_this = 0;
      pnode = pnode->next;
    } else {
      digit = pnode->data;
      digit_this = pnode_this->data;
      pnode = pnode->next;
      pnode_this = pnode_this->next;
    }
    digit_sum = digit + digit_this + carry;
    if (digit_sum >=10) {
      digit_sum-=10;
      carry = 1;
    } else {
      carry = 0;
    }
    sum_list.PushNode(digit_sum);

  }
  return sum_list;
}

私のメイン関数では、次のような3つのオブジェクトを作成しました。

LinkedList<int> list1;
LinkedList<int> list2;
LinkedList<int> sum;

次に、2つのリストを追加し、結果を合計で保存しました。

sum = list1+list2; //error occurred here!

LinkedListクラスに関するすべての宣言と定義はMySinglyLinkedList.hにあり、メイン関数は2_4.ccにあります。

Linux(Ubuntu)でGCC 4.5.2を使用して2_4.ccをコンパイルしましたが、次のエラーが発生しました。

2_4.cc:関数'<code> int main(int、char **)':

2_4.cc:39:15:エラー:'<code> sum = LinkedList <T> :: operator +(LinkedList <T>&)[with T = int]((( LinkedList <int>&)(&list2)))'</ p>

MySinglyLinkedList.h:171:16:注:候補は次のとおりです。LinkedList<T>& LinkedList<T>::operator=(LinkedList<T>&) [with T = int]

オーバーロードされた関数に何か問題がありますか?

4

2 に答える 2

1

参照引数:

LinkedList<T>& LinkedList<T>::operator=(LinkedList<T> &list)
LinkedList<T> LinkedList<T>::operator+(LinkedList<T> &list)

const-refに変更する必要があります:

LinkedList<T>::operator=(const LinkedList<T> &list)
LinkedList<T> LinkedList<T>::operator+(const LinkedList<T> &list)

値をoperator=渡してコピースワップイディオムを利用する方がさらに良いです:

LinkedList<T>::swap(LinkedList<T> & rhs) {
    using std::swap;
    swap(head, rhs.head);
    swap(tail, rhs.tail;
}

LinkedList<T>& LinkedList<T>::operator=(LinkedList<T> list) {
    this->swap(list);
    return *this;
}

注:これには、コピーコンストラクターが正しく実装されている必要があります。

于 2013-01-12T02:48:35.210 に答える
1

引数totoperator=はconst参照である必要があります。一時(operator +の結果)を非定数参照にバインドすることはできません。

于 2013-01-12T02:33:07.993 に答える