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

时间:2014-06-14 11:15:01

标签: 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> 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'一起使用吗? 如果是这样,为什么不在行上说明默认参数?

2 个答案:

答案 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>

标准说什么? (n3337

  

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;