我可以使用别名模板专门化一个类模板吗?

R. *_*des 12 c++ template-specialization c++11 template-aliases

这是一个简单的例子:

class bar {};

template <typename>
class foo {};

template <>
using foo<int> = bar;
Run Code Online (Sandbox Code Playgroud)

这是允许的吗?

How*_*ant 11

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

参考:14.1 [temp.decls]/p3:

3由于别名声明无法声明模板ID,因此无法部分或显式地专门化别名模板.


小智 11

虽然别名的直接专业化是不可能的,但这是一种解决方法.(我知道这是一个老帖子,但它很有用.)

您可以使用typedef成员创建模板结构,并专门化结构.然后,您可以创建引用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.
Run Code Online (Sandbox Code Playgroud)

这使您可以foo通过专业化间接专业化footype.

您甚至可以通过继承自动提供typedef的远程类来进一步整理它.但是,有些人可能会发现这更麻烦.就个人而言,我喜欢它.

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

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

foo<float> y; // y is a bar.
Run Code Online (Sandbox Code Playgroud)


R. *_*des 7

根据该标准的§14.7.3/ 1(在另一个答案中也提到),别名不允许作为明确的专业化:(

以下任何一种明确的专业化:

  • 功能模板
  • 类模板
  • 类模板的成员函数
  • 类模板的静态数据成员
  • 类模板的成员类
  • 类或类模板的成员类模板
  • 类或类模板的成员函数模板

可以宣布[...]