エイリアステンプレートを使用してクラステンプレートを専門とすることはできますか?
-
22-10-2019 - |
質問
これが簡単な例です:
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によると(これも参照されます その他の答え)、エイリアスは明示的な専門化として許可されていません:(
次のいずれかの明示的な専門化:
- 関数テンプレート
- クラステンプレート
- クラステンプレートのメンバー関数
- クラステンプレートの静的データメンバー
- クラステンプレートのメンバークラス
- クラスまたはクラステンプレートのメンバークラステンプレート
- クラスまたはクラステンプレートのメンバー関数テンプレート
宣言することができます[...
所属していません StackOverflow