2014-06-21 38 views
3

我想使一個類的友元函數從一個全局命名空間,這似乎是做工精細,除非友元函數使用自定義的返回類型是這樣的:友元函數

typedef int Type; 

Type myFunction(); 

namespace foo { 

class Foo 
{ 
public: 
    friend Type ::myFunction(); 

private: 
    void bar() {} 
}; 

} 

Type myFunction() 
{ 
    foo::Foo a; 
    a.bar(); 
    return 0; 
} 

如果int代替Type代碼編譯,但與typedef編譯器似乎並沒有分開命名空間中的類型,並給出了一個錯誤:

error: expected a class or namespace 
     friend Type ::myFunction(); 
      ^
error: C++ requires a type specifier for all declarations 
     friend Type ::myFunction(); 

我使用鐺++ 500 。 2.79在OS X上。 我可以使用#define而不是typedef作爲示例中的解決方法,但是在我的現實世界問題中,自定義類型來自另一個無法更改的頭文件。 任何幫助,將不勝感激。

+0

編譯得很好[至少在Ideone(GCC)](http://ideone.com/5wLR5y)。真的好像是[clang特定問題](http://coliru.stacked-crooked.com/a/2d7ccf99e0ca5d1b)。 –

+0

同樣的問題,我用gcc 4.9.2-6,awesomeyi的答案爲我解決了它.. 這是一個錯誤? – frans

回答

5

這適用於GCC,但不適用於VS13,或者如您所說,在鏗鏘聲++。但是,這解決了VS13中的問題:

friend Type (::myFunction()); 
+0

謝謝!在clang ++中也是如此。 – makuz