使用模板重载operator =时出错

时间:2015-11-02 18:49:46

标签: c++ templates

我试图使用模板为我的链表类编写一个重载的赋值运算符,但我不断收到错误。

对我做错的任何帮助都会很棒。

我得到的错误是"行外定义与LL"中的任何声明都不匹配。

我的声明是:

const LL<T>& operator=(const LL<T> &rhsObj);

,实施是:

template<typename T>
LL<T>& LL<T>::operator=(const LL<T>& rhsObj) const
{
    if (this!= &rhsObj)
    {
        //no self assignment so OK to continue
        //deallocate left hand side memory
        this->clear();

        count = 0;
        head = NULL;

        cout <<"calling function copyList()" << endl;

        count = 0;
        head = NULL;

        string diCode = "";
        int onNode = 0;

        if(rhsObj.head == NULL)
        {
            cout <<"other list is empty, nothing to do" << endl;

        }
        else
        {
            onNode =0;
            Node<T> *otherCurrent = rhsObj.head;
            while( otherCurrent != NULL)
            {
                int duplicateInfo;
                duplicateInfo = otherCurrent->info;

                push_back(duplicateInfo);

                otherCurrent = otherCurrent ->next;
                onNode++;

            } //END while(otherCurrent != NULL)

        } // END else block of if (otherLL.head == NULL)

    } // END if (this != &rhsObj)

    return *this;
}

1 个答案:

答案 0 :(得分:0)

在更新的代码中,错误是因为您的声明是:

const LL<T>& operator=(const LL<T> &rhsObj);

但尝试的实施是:

LL<T>& LL<T>::operator=(const LL<T>& rhsObj) const

const的位置实际上很重要。第一个意味着函数返回一个const的引用;第二个意味着你不能在函数中修改*this

尾随const是函数签名的一部分,因此编译器不会将您的实现视为与最初声明的函数相对应。因此,您似乎正在尝试添加一个在类定义中未声明的新函数,这是不允许的。

要解决此问题,请使实现与声明匹配(将const从结尾移至开头)。