C++11中'using'类型别名的默认模板参数

7

我希望给一个类型取一个别名,这样如果需要的话就可以给它传递一个模板参数。

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个回答

11

简介

在别名模板中,给模板参数设置默认值是合法的,但当你后续使用该别名时,不能省略<>符号。

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]

一个包含别名声明(第7条)的模板声明会将该标识符声明为别名模板。别名模板是一组类型的名称,别名模板的名称是模板名称

以上内容说明,模板别名引入的名称是模板名称,而模板名称必须后跟模板参数列表

14.2p1 Names of template specialization [temp.names]

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

template-name:
  identifier

注意:请注意,当引用简单模板ID时,两个<>是必需的,而仅有模板名称本身只是一个标识符,不是类型。


3

您可以仅使用函数模板而不使用<>。 对于类,需要使用空的模板参数列表:

    val<> v;    //should now be equal to val<float> v;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接