5

クラステンプレートがあります

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

の特殊化を別のクラスのフレンドにしたいのですがN=0、その構文がわかりません (そして、自分で見つけることができませんでした)。私は試した:

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

  /* ... */
};

Foo< G, 0 >どのタイプのGも の友達になりたいですclass Bar< T >。これの正しい構文は何ですか?

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

4

2 に答える 2

2

C++03 では不可能です。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;
};
于 2013-08-13T14:57:41.420 に答える
1

C++ 11 がなければ、できることは偽の型エイリアスであると思います。これには、いくつかのコード (コンストラクター) の複製が必要になる場合があります (これは、試みている実際の問題を解決しない可能性があります)。

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;

  /* ... */
};
于 2013-08-13T15:01:25.980 に答える