2016-12-16 1 views
4

私はテンプレート(ヘルパー)クラスを持っていて、テンプレートのすべてのインスタンス化されたクラスをフレンドにしたいと考えています(テンプレート引数を時々内部に入れても、このようテンプレートのすべてのインスタンス化されたクラスを相互に友人として宣言することは可能ですか?

:gccが、私は(名前空間スコープで現れなければならない)許可されていないいくつかのテンプレートを特化してることを私に警告しているので、

template </* some types */> 
class Foo { 
    template </* same as above types */> 
    friend class Foo</* template arguments */>; 
    // ... 
}; 

はしかし、これはコンパイルされません。私は何かを専門にしようとしていません...

それを行う方法はありますか?もともと


、多くの多くの議論があるので、私はいくつかのタイピングを節約するために可変長引数テンプレートを使用しようとしていたが、それはコンパイラによって分業と考えられています。後ですべての引数を入力するように戻しましたが、明示的な特殊化が呼び出されます(<>が保持されます)。

非常に元のコード:

template <class... Ts> 
friend class Foo<Ts...>; 
+0

@RyanHaining、まったく同じように、ありがとう – YiFei

答えて

9

はい、あなたは、単に正しいtemplate friends declaration構文を使用することができます。例えば(説明はコメントに書かれています)

template <T> 
class Foo { 
    // declare other instantiations of Foo to be friend 
    // note the name of the template parameter should be different with the one of the class template 
    template <typename X> 
    friend class Foo; // no </* template arguments */> here, otherwise it would be regarded as template specialization 
}; 
+0

Aha!偉大なので、私の元のコードは、特殊化構文を使用しています...ありがとう。 – YiFei

関連する問題