Templates C++;11';使用';类型别名

Templates C++;11';使用';类型别名,templates,c++11,using,Templates,C++11,Using,我想给一个类型加上别名,以便在必要时给它一个模板参数 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&g

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

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;
}
模板
结构值
{
Tα[d];
};
模板
使用val=值;
int main()
{
val v;//现在应该等于val v;
val w;//也应该是有效的。
返回0;
}
由于某些原因,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’
test.cpp:在函数“int main()”中:
test.cpp:12:13:错误:“v”之前缺少模板参数
val v//现在应该等于val v;
^
test.cpp:12:13:错误:应为“;”在“v”之前
默认模板参数不能与“使用”一起使用吗?
如果是这样,为什么在指定默认参数的行上不这样说?

您只能使用不带
的函数模板。对于类,模板参数的空列表是必需的:

    val<> v;    //should now be equal to val<float> v;
valv//现在应该等于val v;
简介 在别名模板中为模板参数设置默认值是合法的,但在以后使用该别名时,不能忽略

模板
使用val=值;
val v;//合法,decltype(v)=>值
val w;//合法,decltype(w)=>值

标准怎么说?()
14.5.7p1
别名模板
[temp.Alias]

其中声明为别名声明的模板声明(第7条)将标识符声明为别名模板。别名模板是类型族的名称。别名模板的名称是模板名称

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

14.2p1
模板专门化的名称
[temp.Names]

简单模板id:
模板名称
模板名称:
标识符
注意:注意这两个
在引用简单模板id时不是可选的,模板名称本身只是一个标识符,而不是类型