2013-08-13 7 views
5

私はクラステンプレート一部の特殊なテンプレート友人

template< typename G, int N > class Foo { /* ... */ }; 

を持って、私はN=0ための専門は、別のクラスの友人になりたいが、私はそれのための構文を知らない(と私はそれを見つけることができませんでした自分自身)。私が試した:私は、あらゆるタイプG Foo< G, 0 >に必要

template< typename T > 
class Bar { 
    template< typename G > friend class Foo< G, 0 >; 

    /* ... */ 
}; 

class Bar<T>の友人になります。これの正しい構文は何ですか?

ありがとうございました!

答えて

2

C++ 03では不可能です。別の答えで述べたように

Friend declarations shall not declare partial specializations.

は、この問題のいくつかの回避策があるかもしれませんが、あなたが求めている特定の機能は、標準では使用できません:C++ 14.5.3/9標準は、次のよう述べています。

幸いにも、C++ 11が非常によく、今日はサポートされており、テンプレートのエイリアスを指定する機能で、私たちはこれを達成することができます

template <typename, typename> struct X{}; 

template <typename T> 
struct Y 
{ 
    template <typename U> using X_partial = X<T, U>; 
    template <typename> friend class X_partial; 
}; 
+3

これは、gccでコンパイルしますが、打ち鳴らすバージョン3.8でコンパイルに失敗します。エラーメッセージは 'error: 'X_partial'を別の種類のシンボルとして再定義することです テンプレート友人クラスX_partial; ' 。 – ScootyPuff

1

C++ 11がなければ、私はあなたができる最善だと思います(あなたがしようとしている本当の問題を解決できない場合があります)いくつかのコード(コンストラクタ)duplicatationを必要とするかもしれない偽のタイプの別名は、次のとおりです。

template< typename G, int N > class Foo { /* ... */ }; 

template<typename G> class FooAlias : public Foo<G, 0> { }; 

template< typename T > 
class Bar { 
    template< typename G > friend class FooAlias; 

    /* ... */ 
}; 
+0

注: 'template 友人クラスFooAlias;' =>ここで 'G'は不要です。 –

関連する問題