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

Overloading friend operator method in template class

本文关键字:友元 运算符 方法 重载      更新时间:2023-10-16

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

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

错误 C2801:"运算符 ="必须是非静态成员

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

有人可以告诉我我的方式错误 - 我已经陷入了这个:(谢谢。

您的错误是使用 friend ,它将函数从成员函数更改为inline定义的friend函数。

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

让我们来看看C++标准。

§ 9.3/1 类定义中声明的函数,不包括 那些用朋友说明符 (11.3) 声明的称为成员 该类的函数。成员函数可以在 在这种情况下,它是其类的静态成员函数(9.4); 否则,它是其类(9.3.1, 9.3.2)。

§ 13.5.3/1 赋值运算符应由非静态 只有一个参数的成员函数。[..]

所以你不能把operator=当朋友。

在§ 11 [类访问]中:

1 类的成员可以是

— private; 也就是说,它的名字只能由成员和朋友使用 声明它的类。

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

如果你想学习重载运算符的正确方法,请参阅 c++-FAQ 的运算符重载,尽管重载operator=的内容在什么是复制和交换习惯用法中有所介绍?。

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