"operator =必须是非静态成员"是什么意思?

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=....

  • 对不起,这是错的.operator =必须是成员(就像编译器所说的那样).对于operator []和operator()以及可能还有一些我想念的其他人也是如此.基本上所有那些与修改状态而不是产生值有关.纠正你的答案,我会收回-1.Keand64的问题是他错过了指定类(list <T>::),这与这个答案没什么关系. (13认同)
  • 你的答案仍然是误导.事实上,带有1个参数的运算符重载必须是成员函数,但是赋值运算符没有两个参数版本. (7认同)
  • 别担心.我们都有我们的段错误:) (4认同)

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突然恢复,可能会引起意外.


cle*_*tus 6

如果将运算符作为成员函数重载,则应使用此模板:

class A {
  A& operator=(const A& other) {
    if (this != &other) {
      ...
    }
    return *this;
  }
}
Run Code Online (Sandbox Code Playgroud)

需要注意三点:

  1. 使用赋值运算符检查自赋值(如上所述);
  2. 参数应该是const引用; 和
  3. 将操作结果作为非const引用返回,返回*this以允许运算符链接.

您还可以重载类外部的操作符.这与此示例无关,因为您无法使用赋值运算符执行此操作,但值得注意,因为在许多情况下它优于成员函数.典型的形式是:

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)