23 c++ class operator-overloading non-static
我正在创建一个双链表,并重载了operator =使列表上的另一个相等:
template<class T>
void operator=(const list<T>& lst)
{
clear();
copy(lst);
return;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时出现此错误:
container_def.h(74) : error C2801: 'operator =' must be a non-static member
Run Code Online (Sandbox Code Playgroud)
此外,如果有帮助,第74行是定义的最后一行,带有"}".
v3.*_*v3. 21
正是如此:带有1个参数的运算符重载必须是成员函数.(在课堂内宣布)
template<class T>
void list<T>::operator=(const list<T>& rhs)
{
...
}
Run Code Online (Sandbox Code Playgroud)
另外,从L =返回LHS可能是一个好主意,所以你可以链接它(比如a = b = c) - 所以要做到
list<T>& list<T>::operator=....
Joh*_*itb 18
将该运算符放在类定义中.它必须是一个成员,因为它operator=是特殊的,无论如何你都不会通过将它写成非成员来获得某些东西.非会员运营商有两个重要的主要好处:
因为operator=,两者都不可用.分配转换的临时结果没有意义,并且operator=在大多数情况下需要访问内部.此外,operator=如果您不提供特殊功能(所谓的复制赋值运算符),C++会自动提供特殊功能.使operator=非超级成员过载成为可能会带来额外的复杂性,显然没有实际收益,因此这是不允许的.
因此,更改您的代码,使其看起来像这样(这假设operator=它不是一个复制赋值运算符,而是从a分配list<T>给其他东西.这在您的问题中不明确):
class MyClass {
...
template<class T>
MyClass& operator=(const list<T>& lst)
{
clear();
copy(lst);
return *this;
}
...
};
Run Code Online (Sandbox Code Playgroud)
a的标准是a operator=再次返回对自身的引用.我建议你坚持这种做法.程序员看起来很熟悉,如果void突然恢复,可能会引起意外.
如果将运算符作为成员函数重载,则应使用此模板:
class A {
A& operator=(const A& other) {
if (this != &other) {
...
}
return *this;
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意三点:
您还可以重载类外部的操作符.这与此示例无关,因为您无法使用赋值运算符执行此操作,但值得注意,因为在许多情况下它优于成员函数.典型的形式是:
class A {
friend const A& operator+(const A& a, const A& b);
...
}
const A& operator+(const A& a, const A& b) {
A& ret = ...
return ret;
}
Run Code Online (Sandbox Code Playgroud)
这个返回一个const引用,所以你不能这样做:
(a + b) = c
Run Code Online (Sandbox Code Playgroud)