我正试图寻找一个替代下面的困境。你知道如何当你有一个默认的模板参数的模板类/函数,但你将不得不应用尖括号,即使它们是空的?这是我尝试修复。我知道我可以使用简单的typedef
(typedef X<> L
),但我不想使用不同的名称来引用该类。为什么default-template参数不能使用声明?
所以我尝试了以下。但由于某些原因,即使我为模板参数提供了一个类型,它仍然不起作用。这是为什么?
#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: error: missing template arguments before ‘l’
prog.cpp:10:7: error: expected ‘;’ before ‘l’
有趣的是,他的代码如何使用这个事实......'X <>'出现在'using'行中。 – 2013-05-09 20:47:40
但是,如果它是一个typedef'd模板,那么L将工作得很好。这是为什么? – 2013-05-10 00:23:55
@ZanLynx区分不在'typedef'和'using'之间,它在模板和类型之间。你当然也可以说'使用L = X <>;'。 – 2013-05-10 01:07:06