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

Why don't default-template arguments work on using declarations?

本文关键字:声明 适用于 不适用 默认 参数 为什么      更新时间:2023-10-16

我正试图寻找一个替代以下困境。你知道,当你有一个模板类/函数的默认模板参数,但你将不得不应用尖括号,即使他们是空的?这是我试图解决的问题。我知道我可以使用一个简单的typedef (typedef 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: In function ' int main() ':
Prog.cpp:10:7:错误:' l '前缺少模板参数
Prog.cpp:10:7:错误:期望';'在' l '之前

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

L<> l;

using声明实际上是多余的,因为它里面的conditional什么也不做——你可以把它去掉,得到template <typename T = void> using L = X<T>;——显然不是你想要的。

事情是这样的:没有别的办法;类型模板与类型不同(原因也很充分!),不能将后者视为前者——必须实例化模板才能获得类型。