2013-05-09 70 views
2

我正试图寻找一个替代下面的困境。你知道如何当你有一个默认的模板参数的模板类/函数,但你将不得不应用尖括号,即使它们是空的?这是我尝试修复。我知道我可以使用简单的typedeftypedef 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’

回答

4

的语法是一样的,对于其他类型的模板:你需要甚至默认模板提供的空模板支架:

L<> l; 

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

而事情就是这样:没有办法解决这个问题。类型模板与类型不同(也有很好的理由!),并且你不能将后者当成前者 - 你必须实例化模板来获取类型。

+0

有趣的是,他的代码如何使用这个事实......'X <>'出现在'using'行中。 – 2013-05-09 20:47:40

+0

但是,如果它是一个typedef'd模板,那么L将工作得很好。这是为什么? – 2013-05-10 00:23:55

+0

@ZanLynx区分不在'typedef'和'using'之间,它在模板和类型之间。你当然也可以说'使用L = X <>;'。 – 2013-05-10 01:07:06

相关问题