我在考虑std::tuple
的可能实现(以及任何类似的模板类,其中包含可变数量的"成员"在编译时定义),我想也许可以创建一个&#34 ;递归类型"类似于链表。我尝试编译以下测试用例:
template <typename FirstType, typename... OtherTypes>
class TupleLite
{
public:
FirstType type_;
TupleLite<OtherTypes...> other_types_;
};
int main()
{
TupleLite<int,double> mytuple;
}
类本身编译时没有错误,但实例化会抛出错误wrong number of template arguments (0, should be 1 or more)
。我相信这是因为TupleLite<int, double>
尝试实例化TupleLite<double>
,它试图实例化TupleLite<>
,但没有有效的定义。
这个&#34;递归大小的班级&#34;打捞?我尝试定义&#34;无参数专业化&#34; TupleLite
如下:
template <>
class TupleLite {}
....但这似乎不起作用,尽管g++
和clang++
似乎不确定原因。
从g++
开始,最相关的错误似乎是:
error: template specifiers not specified in declaration of ‘template<class FirstType, class ... OtherTypes> class TupleLite’
class TupleLite
^
error: wrong number of template arguments (0, should be 1 or more)
TupleLite<OtherTypes...> other_types_;
^
然而, clang++
说:
error: extraneous 'template<>' in declaration of class 'TupleLite'
template <>
^
error: redefinition of 'TupleLite' as different kind of symbol
class TupleLite
^
答案 0 :(得分:3)
TupleLite
的主要模板定义指定它至少需要一个模板参数FirstType
。既然这不是你要表达的内容,那么提供一个主要的模板定义,最终也会处理这样的空案例:
template <typename...>
class TupleLite{};
一个部分专业化:
template <typename FirstType, typename... OtherTypes>
class TupleLite<FirstType, OtherTypes...>
{
public:
FirstType type_;
TupleLite<OtherTypes...> other_types_;
};
编辑:感谢Nikos指出在这种情况下不需要空的规格。