我正在努力寻找以下两难的替代方案。你知道当你有一个带有默认模板参数的模板类/函数时,你必须应用尖括号,即使它们是空的吗?这是我尝试修复的方法。我知道我可以使用简单的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:在函数'int main()'中:
prog.cpp:10:7:错误:在'l'之前缺少模板参数 prog.cpp:10:7:错误:预期';'在'l'
之前
答案 0 :(得分:4)
语法与其他类型模板的语法相同:即使是默认模板,也需要提供空模板括号:
L<> l;
using
声明实际上是多余的,因为它内部的conditional
什么都不做 - 你可以删除它,产生template <typename T = void> using L = X<T>;
- 显然不是你想要的。
事情就是这样:没有办法解决这个问题;类型模板与类型不同(也有很好的理由!)并且您不能将后者视为前者 - 您必须实例化模板才能获得类型。