在模板类中重载友元运算符方法
Overloading friend operator method in template class
我正在尝试重载模板类的赋值('=')运算符,但我需要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=
不需要是朋友函数。我责怪疲倦设法完全忽略了对象可以访问同一类对象的私有和受保护成员......
相关文章:
- 模板类无法识别友元运算符
- 模板化类的嵌套类中的友元运算符
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- C++模板内部类友元运算符重载
- 使用shared_ptr向量重载 ostream 友元运算符
- 使用模板类重载的友元运算符
- 尝试重载模板类友元<<运算符时出错
- 友元运算符中的变量范围
- 为什么友元运算符<<在某些情况下使用,而在其他情况下不使用
- 模板化类中友元运算符的多个定义
- 模板类友元运算符成员函数
- C++模板类友元运算符重载
- 如何在模板类中使用友元运算符
- 类内声明的友元运算符中左手参数的隐式转换
- 在模板类中重载友元运算符方法
- 在Wandevoorde&Jossutis的书中有两个参数的非友元运算符+
- 使用友元运算符分配和私有变量是不可访问的
- 在模板类中创建重载友元运算符的模板
- 不同命名空间中的友元运算符
- C++0x,用户定义的文本,带有友元运算符 " " ()