2011-06-28 96 views
7

在C++ 03中,以下是非法的,儘管一些編譯器支持它。作爲朋友的模板參數

template <class T> 
class X 
{ 
    friend T; 
}; 

這是在C++ 11合法化嗎? (對不起,沒有時間閱讀草稿我自己,只是希望有人知道這一點)

+1

[標籤:朋友]是對C++正確。 – user7116

+4

[朋友](http://www.stackoverflow.com/questions/tagged/friends)適用於Facebook。 –

+3

@Ken:我很高興它不適用於電視節目xD –

回答

11

從部分§11.3,3 N3291:

template <typename T> class R { 
    friend T; 
}; 

R<C> rc; // class C is a friend of R<C> 
R<int> Ri; // OK: "friend int;" is ignored 

所以它是合法的C++ 11。

+4

我很高興'friend int;'被忽略:) –

1

是的C++ 0x允許模板參數成爲朋友。

嗯,我碰巧記得之前在草稿中讀過它,但找不到參考資料。通常情況下,@Praetorian的答案是明確的。

0

它是純C++是非法的,但有一個簡單的解決方法

template <class T> 
class X 
{ 
    private: 
     class Wrapper 
     { 
      public: 
       typedef T Type; 
     }; 
     friend class Wrapper::Type; 
}; 
+0

適用於gcc,但不適用於VC2010和Comeau – Sumant

+0

是的,在Clang也試過它,didn不工作:(顯然標準禁止與GCC不檢查的typedef'd類型結合,但它允許編寫GCC無法識別的'friend T;',但是Clang會這麼做。 – Frigo