我第一次尝试使用可变参数模板元编程,并且始终遇到无法跟踪的编译器错误。
我正在遵循此页面上的“元组”示例(尽管我将对象称为ItemSet
)
该ItemSet
部分可以很好地编译:
template<typename...Ts> class ItemSet { };
template<typename item_T, typename ...Ts>
class ItemSet<item_T, Ts...> : public ItemSet<Ts...>
{
public:
ItemSet(item_T t, Ts... item_types) : ItemSet<Ts...>(item_types...), tail(t) { }
protected:
item_T tail;
};
template <typename...M> struct type_holder;
template<typename T, typename ...M>
struct type_holder<0, ItemSet<T, M...>>
{ // ERROR: M parameter pack expects a type template argument.
typedef T type;
};
template <int k, typename T, typename ...M>
struct type_holder<k, ItemSet<T, M...>>
{
typedef typename type_holder<k - 1, ItemSet<M...>>::type type;
};
int main()
{
ItemSet<int, string, string, double> person(0, "Aaron", "Belenky", 29.492);
}
但是,在注释掉的代码中,在type_holder的声明中出现编译器错误。我已经尝试过使用相同语法的多种变体,但始终存在相同的问题。
我正在使用Microsoft Visual Studio 2013,该软件应该完全支持模板编程和可变参数模板。
您了解什么是编译器错误,可以向我解释一下吗?
直接的问题是您正在定义type_holder
没有通用模板的专业化。此外,还有一个简单的错字(typeholder
代替type_holder
)。修复了这两个问题,使其可以与其他编译器一起编译:
template <int, typename T>
struct type_holder;
template <int k, typename T, typename ...M>
struct type_holder<k, ItemSet<T, M...>>
{
typedef typename type_holder<k - 1, ItemSet<M...>>::type type;
};
template<class T, class ...M>
struct type_holder<0, ItemSet<T, M...>>
{
typedef T type;
};
您使用的编译器发出的错误不是特别有用。我建议保持周围几个C ++编译器只是为了测试模板代码(我通常使用gcc
,clang
和英特尔的编译器)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句