0

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

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

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

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

有人可以告诉我我的方式的错误吗 - 我已经非常坚持这个:(谢谢。

4

3 回答 3

3

您的错误是 using friend,它将函数从成员函数更改为inline-definedfriend函数。

operator=只能定义为非静态成员函数,并且需要两个参数,即隐式this和显式右侧。

于 2014-11-19T02:29:40.643 回答
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=的内容在What is the copy-and-swap idiom? .

于 2014-11-19T02:42:02.023 回答
0

正如 0x499602D2 所指出的,operator=不需要是友元函数。我将疲倦归咎于设法完全忽略对象可以访问同一类对象的私有和受保护成员...

于 2014-11-19T02:35:12.543 回答