C ++全局重载运算符= [重复]

Posted

技术标签:

【中文标题】C ++全局重载运算符= [重复]【英文标题】:C++ globally overloaded operator= [duplicate] 【发布时间】: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的一部分,不能是全局的。 部分错误信息说明了一切——必须是非静态成员函数 【参考方案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。特别是如果复制成本很高。我知道一般的预期行为是返回参考,但这必须根据使用成本来衡量。 返回参考并不昂贵。如果函数是内联的,大多数编译器都会对其进行优化并且是免费的。

以上是关于C ++全局重载运算符= [重复]的主要内容,如果未能解决你的问题,请参考以下文章

全局删除冲突重载

04. 命名空间,函数重载,内联

04. 命名空间,函数重载,内联

类中的函数重载

重载+号运算符出错

C++深度剖析学习总结 22 类中的函数重载