2015-04-03 39 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; 
} 
相關問題