2011-06-28 7 views
7

C++ 03では、一部のコンパイラでサポートされていますが、次は不正です。テンプレートパラメータを友だちとして

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

これはC++ 11で合法化されていますか?

+1

があるC++のために正しいです。 – user7116

+4

[friends](http://www.stackoverflow.com/questions/tagged/friends)はFacebookのためのものです。 –

+3

@ケン:テレビ番組ではないとうれしいxD –

答えて

11

、N3291で3:

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の答えはそれを釘付け。セクション§11.3から

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でも試しました。どうやら、標準ではGCCがチェックしないtypedefの型には似合っていないようですが、GCCは認識できないが、Clangは 'friend T;'を書くことは許されています。 – Frigo

関連する問題