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 ++全局重载运算符= [重复]的主要内容,如果未能解决你的问题,请参考以下文章