但问题是第1点如何可能 给定代码在GNU(ubuntu)编译器上成功运行....
#include<bits/stdc++.h>
using namespace std;
class dev{
string str;
int n;
public:
friend void operator >>(istream &din,dev &s1)
{
din>>s1.str>>s1.n;
}
friend void operator <<(ostream &dout,dev &s1)
{
dout<<s1.str<<" "<<s1.n;
}
};
int main()
{
dev s2;
cin>>s2;
cout<<s2;
}
答案 0 :(得分:1)
根据C ++标准(11.3朋友)
6如果和,可以在类的朋友声明中定义函数 只有当类是非本地类(9.8)时,函数名才是 不合格,函数具有命名空间范围。
然而,除非在封闭的命名空间中声明它,否则它在类外部是不可见的。
然而,由于所谓的Argument Dependent Lookup,编译器可以找到该函数。
由于ADL,在您的示例中,运算符被成功调用。
例如,此声明
cout<<s2;
编译器发现使用了dev(dev s2;)类型的对象,并在类的范围内搜索运算符。
考虑到运算符返回对流的引用时更好。在这种情况下,您可以将运算符与其他流运算符组合使用。 例如
friend std::ostream & operator <<( std::ostream &dout, const dev &s1 )
{
return dout << s1.str << " " << s1.n;
}