2015-04-03 76 views
-2
  1. 定义友元函数的类里面来统治我们不能定义类的内部友元函数
  2. 为istream和ostream的,我们总是声明友元函数(所以它是正确的),在下面的代码

但对于第一点(Ubuntu的)编译器我们可以在CPP根据

#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; 
} 
+5

1.显然是错误的。 – juanchopanza 2015-04-03 06:59:51

+0

**在课堂内声明**它的“朋友”。 **在班级之外实施**(作为全球职能)。 – 2015-04-03 07:06:43

回答

1

的问题是如何能够在给定的代码 对GNU成功运行....按照C++标准(11.3好友)

6所述的功能可以在一个类的一个朋友声明来定义当且 只有如果该类是一个非局部类(9.8),功能名称是 不合格,并且函数具有命名空间范围。

但是它在类外部是不可见的,直到它将在封闭名称空间中声明。

尽管如此,编译器可以根据所谓的参数相关查找找到函数。

这是由于ADL在您的示例中操作符被成功调用。

例如,对于此声明

cout<<s2; 

编译器看到有用于类型dev的的对象(dev的S2),并寻求操作者在类的范围。

考虑到当运算符返回对流的引用时效果会更好。在这种情况下,您可以将操作员与其他流操作员结合使用。 例如

friend std::ostream & operator <<(std::ostream &dout, const dev &s1) 
{ 
    return dout << s1.str << " " << s1.n; 
}