【问题标题】:C++ globally overloaded operator= [duplicate]C ++全局重载运算符= [重复]
【发布时间】:2011-06-29 13:25:03
【问题描述】:

可能重复:
What does “operator = must be a non-static member” mean? (C++)

嗨,

我有以下代码...

// Header file
  struct dataRecord{
     size_t id;
     char name[gcNameLength];
  };

  void operator=(dataRecord &adr, const dataRecord &bdr);

gcc 在编译时如何给我以下错误。

error: ‘void operator=(dataRecord&, const dataRecord&)’ must be a nonstatic member function

感谢您的帮助。

【问题讨论】:

  • “必须是非静态成员函数” - 这里有什么不清楚的地方?
  • 在这种情况下,错误消息非常准确地说明了问题:如果你要重载operator=,你不能把它作为一个全局函数——你必须使用一个非-static 成员函数(使用全局的通常原因是允许在左操作数上进行转换,但无论如何这不适用于赋值)。
  • 所以它必须是struct的一部分,不能是全局的。
  • 部分错误信息说明了一切——必须是非静态成员函数

标签: c++ operators overloading


【解决方案1】:

您需要对struct dataRecord 本身重载= 操作。

类似:

struct dataRecord{
   size_t id;
   char name[gcNameLength];
   dataRecord& operator= (const dataRecord&) {
       // write overload code here
   }
};

【讨论】:

    【解决方案2】:

    没有 operator= 函数这样的东西。运算符必须是类或结构的成员。该函数的参数被视为右值。具有成员函数的对象是左值。

    【讨论】:

      【解决方案3】:

      What does “operator = must be a non-static member” mean? 中所述,运算符重载需要是成员函数。

      请注意,当您重载 operator= 时,您应该返回对左操作数的引用,这样它就不会中断流程,并且允许如下表达式:

      dataRecord r1;
      dataRecord r2;
      ...
      dataRecord r3 = r2 = r1;
      

      【讨论】:

      • 我不介意从 operator= 返回 void。特别是如果复制成本很高。我知道一般的预期行为是返回参考,但这必须根据使用成本来衡量。
      • 返回参考并不昂贵。如果函数是内联的,大多数编译器都会对其进行优化并且是免费的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2011-10-27
      • 2012-12-22
      • 2016-09-26
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多