2

我正在尝试寻找以下困境的替代方案。你知道当你有一个带有默认模板参数的模板类/函数时,即使它们是空的,你也必须应用尖括号?这是我进行修复的尝试。我知道我可以使用简单的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'之前缺少模板参数<br> prog.cpp:10:7:错误:预期';' 在'l'之前<br>

4

1 回答 1

4

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

L<> l;

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

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

于 2013-05-09T20:45:18.457 回答