2013-07-25 56 views
5

這讓我感到驚訝。這工作:C++內聯朋友函數與成員變量名稱相同

struct foo { 
    int x; 
    friend int x(foo f) { return f.x; } 
    friend int y(foo f); 
}; 

int y(foo f) { return x(f); } // no problem 

但是,這是一個錯誤:

struct foo { 
    int x; 
    friend int x(foo f) { return f.x; } 
    friend int y(foo f) { return x(f); } // error: invalid use of foo::x data member 
}; 

爲什麼沒有這兩個(DIS)的允許?

+1

是否返回:: x(f);'工作?這應該明確引用全局名稱空間中的'x()'。 (如果'x()'不在全局命名空間中,則嘗試':: the :: namespace :: x(f)'。) – cdhowie

+0

@cdhowie:「未找到**的朋友的名字**查找**或通過合格的查找**直到在該名稱空間範圍內提供匹配聲明「。依賴於參數的查找是找到它的唯一方法,或者在類的上方添加一個聲明(因爲下面的類爲'friend int y()'的內聯聲明找不到) –

+1

什麼樣的命名約定會導致到一個成員變量和一個朋友函數共享一個名字?這是你真正需要解決的問題。 –

回答

3

原因是,在第一種情況下,友誼將函數聲明注入到封閉名稱空間中,因此全局調用x只能看到一個x

在第二個示例中,x具有兩個在該範圍的含義:全局朋友函數和變量(可能會影響全局朋友函數)。

+2

根據http://stackoverflow.com/a/8284809/103167,不,你不能把它稱爲':: x(f)'。 –

+1

Ben是正確的,除非您還在名稱空間級別提供聲明,否則只能通過ADL訪問friend函數。 –

相關問題