Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板类中重载友元运算符方法_C++_Templates_Operator Overloading_Friend Function_C++ Faq - Fatal编程技术网

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

C++ 在模板类中重载友元运算符方法,c++,templates,operator-overloading,friend-function,c++-faq,C++,Templates,Operator Overloading,Friend Function,C++ Faq,我试图重载模板类的赋值('=')运算符,但我需要运算符=方法作为友元函数 我认为这很简单,但我做错了,因为下面的代码会导致编译错误: 错误C2801:“运算符=”必须是非静态成员 模板 类IDataStream { 公众: friend void运算符=(常量IDataStream和数据流) { //设置一些私人成员,例如。 //this->{…}=dataStream.{…}; }; } 有人能告诉我我的错误吗?我已经被困在这个问题上了:( 谢谢。您的错误是使用了friend,它将函数从成员

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

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

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

模板
类IDataStream
{
公众:
friend void运算符=(常量IDataStream和数据流)
{
//设置一些私人成员,例如。
//this->{…}=dataStream.{…};
};
}
有人能告诉我我的错误吗?我已经被困在这个问题上了:(
谢谢。

您的错误是使用了
friend
,它将函数从成员函数更改为
内联
-定义的
friend
-函数


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

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


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

正如0x499602D2所指出的,
operator=
不需要是友元函数。我把完全忽略对象的访问权限归咎于疲劳0x499 602D2指出,<代码>操作符=< /Cord>不需要是朋友函数。我把管理的疲劳归咎于完全忽略了对象访问同一类对象的私有和受保护成员……< /P> < P> >让我们看看C++标准。

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

§13.5.3/1指派操作员应由非静态操作员执行 仅具有一个参数的成员函数。[..]

所以你不能让
operator=
成为朋友

在§11【类别访问】中:

1类的成员可以是

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

因为成员函数是类的成员,所以它不需要友元说明符来访问私有数据成员


如果您想学习正确的方法来加载一个操作符,请参阅“s”,虽然重载的代码<代码>运算符=<代码>被覆盖。

让我们看一下C++标准。< /P> §9.3/1类定义中声明的函数,不包括 使用友元说明符(11.3)声明的称为成员 该类的函数。成员函数可以在 在这种情况下,它是其类的静态成员函数(9.4); 否则,它是其类的非静态成员函数(9.3.1, 9.3.2)

§13.5.3/1指派操作员应由非静态操作员执行 仅具有一个参数的成员函数。[..]

所以你不能让
operator=
成为朋友

在§11【类别访问】中:

1类的成员可以是

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

因为成员函数是类的成员,所以它不需要友元说明符来访问私有数据成员


如果您想了解重载运算符的正确方法,请参见,尽管重载
运算符=
的内容已在中介绍。

为什么它必须是
朋友?@0x499602D2,因为在operator=,我需要访问IDataStream的私有成员。那么它只是一个常规成员函数有什么问题吗?Member函数可以访问私有数据,因为它们属于类本身。此外,不能使赋值运算符成为非成员函数(这是通过“友好”它来实现的).
operator=
不能是非成员。它总是需要两个参数,隐式的
this
和右侧参数。但是成员函数可以访问私有成员。为什么它必须是
朋友呢?@0x499602D2因为在operator=,我需要访问IDataStream的私有成员。那么仅仅是常规成员函数?成员函数可以访问私有数据,因为它们属于类本身。此外,您不能使赋值运算符成为非成员函数(这是通过“友好”它来实现的).
operator=
不能是非成员。它总是需要两个参数,隐式
this
和右侧。但是成员函数可以访问私有成员
template <typename T>
class IDataStream
{
public:
    friend void operator=(const IDataStream& dataStream)
    {
        // set some private members, e.g.
        // this->{...} = dataStream.{...};
    };
}