エイリアステンプレートを使用してクラステンプレートを専門とすることはできますか?

StackOverflow https://stackoverflow.com/questions/7801228

質問

これが簡単な例です:

class bar {};

template <typename>
class foo {};

template <>
using foo<int> = bar;

これは許可されていますか?

役に立ちましたか?

解決

$ clang++ -std=c++0x test.cpp
test.cpp:6:1: error: explicit specialization of alias templates is not permitted
template <>
^~~~~~~~~~~
1 error generated.

参照:14.1 [Temp.Decls]/P3:

3エイリアスデクラレーションはテンプレートIDを宣言できないため、エイリアステンプレートを部分的または明示的に専門化することはできません。

他のヒント

エイリアスの直接専門化は不可能ですが、ここに回避策があります。 (これは古い投稿であることは知っていますが、便利な投稿です。)

typedefメンバーを使用してテンプレート構造を作成し、structを専門とすることができます。その後、Typedefメンバーを指すエイリアスを作成できます。

template <typename T>
struct foobase {};

template <typename T>
struct footype
  { typedef foobase<T> type; };

struct bar {};

template <>
struct footype<int>
  { typedef bar type; };

template <typename T>
using foo = typename footype<T>::type;

foo<int> x; // x is a bar.

これにより、専門化できます foo 間接的に専門化します footype.

typedefを自動的に提供するリモートクラスから継承することで、さらに整理することもできます。ただし、これが面倒だと思う人もいます。個人的には、私はそれが好きです。

template <typename T>
struct remote
  { typedef T type; };

template <>
struct footype<float> :
  remote<bar> {};

foo<float> y; // y is a bar.

標準の§14.7.3/1によると(これも参照されます その他の答え)、エイリアスは明示的な専門化として許可されていません:(

次のいずれかの明示的な専門化:

  • 関数テンプレート
  • クラステンプレート
  • クラステンプレートのメンバー関数
  • クラステンプレートの静的データメンバー
  • クラステンプレートのメンバークラス
  • クラスまたはクラステンプレートのメンバークラステンプレート
  • クラスまたはクラステンプレートのメンバー関数テンプレート

宣言することができます[...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top