What does “operator = must be a non-static member” mean?

后端 未结 4 1028
眼角桃花
眼角桃花 2020-11-28 13:24

I\'m in the process of creating a double-linked list, and have overloaded the operator= to make on list equal another:

template
void operator=         


        
4条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-28 13:58

    Put that operator inside your class definition. It must be a member because operator= is special and you would not gain something by writing it as a non-member anyway. A non-member operator has two important main benefits:

    • Implicit conversions of the right and the left side of the operator invocation
    • No need to know about internals of the class. Function can be realized as non-member non-friend.

    For operator=, both is not usable. Assigning to a temporary result of a conversion does not make sense, and operator= will need access to internals in most cases. In addition, a special operator= is automatically provided by C++ if you don't provide one (the so-called copy-assignment operator). Making it possible to overload operator= as a non-member would have introduced additional complexity for apparently no practical gain, and so that isn't allowed.

    So change your code so that it looks like this (this assumes the operator= is not a copy-assignment operator, but assigning from a list to something else. This isn't clear from your question):

    class MyClass {
    ...
        template
        MyClass& operator=(const list& lst)
        {
            clear();
            copy(lst);
            return *this;
        }
    ...
    };
    

    It's pretty standard that a operator= returns a reference to itself again. I recommend you to adhere to that practice. It will look familiar to programmers and could cause surprises if it would return void all of a sudden.

提交回复
热议问题