【问题标题】:Overloading friend operator method in template class在模板类中重载友元运算符方法
【发布时间】:2023-04-05 18:49:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么一定要friend
  • @0x499602D2 因为在operator=中,我需要访问IDataStream的私有成员。
  • 那么它只是一个普通的成员函数有什么问题呢?成员函数可以访问私有数据,因为它们属于类本身。此外,您不能使赋值运算符成为非成员函数(您正在通过“结交”它来做到这一点)。
  • operator= 不能是非会员。它总是需要两个参数,隐含的this 和右手边。
  • 但是成员函数可以访问私有成员

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    让我们看一下 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= 的内容。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-08
        • 2021-05-18
        • 2011-06-07
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多