为什么默认模板参数不能使用声明?

时间:2013-05-09 20:42:28

标签: c++ c++11

我正在努力寻找以下两难的替代方案。你知道当你有一个带有默认模板参数的模板类/函数时,你必须应用尖括号,即使它们是空的吗?这是我尝试修复的方法。我知道我可以使用简单的typedeftypedef X<> L),但我不想使用不同的名称来引用该类。

所以我尝试了以下内容。但由于某些原因,即使我为模板参数提供了一个类型,它仍然无效。那是为什么?

#include <type_traits>

template <typename = void> struct X {};

template <typename T = void>
using L = typename std::conditional<
              std::is_void<T>::value,
              X<>,
              X<T>
>::type;

int main()
{
    L l;
}

错误:

  

prog.cpp:在函数'int main()'中:
  prog.cpp:10:7:错误:在'l'之前缺少模板参数   prog.cpp:10:7:错误:预期';'在'l'
之前

1 个答案:

答案 0 :(得分:4)

语法与其他类型模板的语法相同:即使是默认模板,也需要提供空模板括号:

L<> l;

using声明实际上是多余的,因为它内部的conditional什么都不做 - 你可以删除它,产生template <typename T = void> using L = X<T>; - 显然不是你想要的。

事情就是这样:没有办法解决这个问题;类型模板与类型不同(也有很好的理由!)并且您不能将后者视为前者 - 您必须实例化模板才能获得类型。