在模板类中重载friend运算符方法

时间:2014-11-19 02:20:26

标签: c++ templates operator-overloading friend-function

我正在尝试重载模板类的赋值('=')运算符,但我需要operator=方法作为友元函数。

我虽然这很简单,但我做错了,因为下面的代码会导致编译错误:

  

错误C2801:'operator ='必须是非静态成员

template <typename T>
class IDataStream
{
public:
    friend void operator=(const IDataStream& dataStream)
    {
        // set some private members, e.g.
        // this->{...} = dataStream.{...};
    };
}

有人能告诉我我的方式错误 - 我已经变得非常坚持这个:( 感谢。

3 个答案:

答案 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班级成员可以

     
    

- 私人;也就是说,它的名称只能由成员和朋友使用     声明它的类。

  

由于成员函数是该类的成员,因此不需要友元说明符访问私有数据成员。

如果您想了解运算符重载的正确方法,请参阅Operator overloading,尽管What is the copy-and-swap idiom?涵盖了重载operator=的内容。

答案 2 :(得分:0)

正如0x499602D2所指出的那样,operator=不需要是朋友功能。我责备完全忽视对象可以访问私人和保护同一类对象的成员......