我想为一个类型设置别名,以便在必要时可以给它一个模板参数。
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;
}
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’
默认模板参数不能与'using'一起使用吗? 如果是这样,为什么不在行上说明默认参数?
答案 0 :(得分:10)
alias-template 中的模板参数的默认值是合法的,但您不能遗漏<
,和>
,当你后来使用别名时。
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>
14.5.7p1
别名模板[temp.alias]
模板声明,其中声明是 alias-declaration (第7条)声明标识符成为别名模板。别名模板是一系列类型的名称。别名模板的名称是模板名称。
以上说明 template-alias 引入的名称是模板名称,并且必须遵循模板名称通过 template-argument-list 。
14.2p1
模板专精的名称[temp.names]
simple-template-id: template-name < template-argument-list_opt > template-name: identifier
注意:注意两个<>
在引用 simple-template-id 时是不可选的,并且 template-name 本身只是一个标识符,而不是一个类型。
答案 1 :(得分:3)
您只能使用没有<>
的功能模板。对于类,空模板参数列表是必要的:
val<> v; //should now be equal to val<float> v;