C++ 11'使用'类型别名的默认模板参数

Has*_*dev 5 templates using c++11

我想为一个类型别名,以便在必要时可以给它一个模板参数.

template<typename T, unsigned d>
struct value
{
    T a[d];
};

template<typename T=float>
using val=value<T, 2>;

int main()
{
    val v;      //should now be equal to val<float> v;
    val<int> w; //should also be valid.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

G ++因某些原因不赞成:

test.cpp: In function ‘int main()’:
test.cpp:12:13: error: missing template arguments before ‘v’
         val v;      //should now be equal to val<float> v;
             ^
test.cpp:12:13: error: expected ‘;’ before ‘v’
Run Code Online (Sandbox Code Playgroud)

默认模板参数不能与'using'一起使用吗?如果是这样,为什么不在行上说明默认参数?

Fil*_*efp 10

介绍

具有默认值模板参数别名模板 合法的,但你不能离开了<,并且>,当你以后使用所述别名.

template<class T = float>
using val = value<T, 2>;

val<>    v; // legal, decltype(v) => value<float, 2>
val<int> w; // legal, decltype(w) => value<int,   2>
Run Code Online (Sandbox Code Playgroud)

标准说什么?(n3337)

14.5.7p1 别名模板 [temp.alias]

模板声明,其中所述声明是一个别名声明(第7章)声明标识符是一个别名模板.别名模板是一系列类型的名称.别名模板的名称模板名称.

上面说明模板别名引入的名称是模板名称,模板名称后面必须跟有模板参数列表.

14.2p1 模板专业化的名称 [temp.names]

simple-template-id:
  template-name < template-argument-list_opt >

template-name:
  identifier
Run Code Online (Sandbox Code Playgroud)

注意:注意这两个<>在引用simple-template-id时是不可选的,并且模板名本身只是一个标识符,而不是一个类型.