以下のように、「+」演算子と「=」演算子をオーバーロードしようとしました。
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]
オーバーロードされた関数に何か問題がありますか?