我正在尝试重载模板类的赋值('=')运算符,但我需要operator=
方法作为友元函数。
我虽然这很简单,但我做错了,因为下面的代码会导致编译错误:
错误C2801:'operator ='必须是非静态成员
template <typename T>
class IDataStream
{
public:
friend void operator=(const IDataStream& dataStream)
{
// set some private members, e.g.
// this->{...} = dataStream.{...};
};
}
有人能告诉我我的方式错误 - 我已经变得非常坚持这个:( 感谢。
答案 0 :(得分:3)
您的错误正在使用friend
,它将函数从成员函数更改为inline
- 定义的friend
- 函数。
operator=
只能定义为非静态成员函数,需要两个参数,隐式this
和显式右侧。
答案 1 :(得分:1)
让我们来看看C ++标准。
9.3 / 1在类的定义中声明的函数,排除 那些用朋友说明符(11.3)声明的那些被称为成员 该类的功能。可以将成员函数声明为静态 在哪种情况下,它是其类的静态成员函数(9.4); 否则它是它的类的非静态成员函数(9.3.1, 9.3.2)。
§13.5.3/ 1赋值运算符应由非静态实现 成员函数只有一个参数。 [..]
所以你不能让operator=
成为朋友。
在第11节[class.access]中:
1班级成员可以
- 私人;也就是说,它的名称只能由成员和朋友使用 声明它的类。
由于成员函数是该类的成员,因此不需要友元说明符访问私有数据成员。
如果您想了解运算符重载的正确方法,请参阅c++-faq的Operator overloading,尽管What is the copy-and-swap idiom?涵盖了重载operator=
的内容。
答案 2 :(得分:0)
正如0x499602D2所指出的那样,operator=
不需要是朋友功能。我责备完全忽视对象可以访问私人和保护同一类对象的成员......