具有可变参数模板的模板元编程:编译器错误

阿贝伦基

我第一次尝试使用可变参数模板元编程,并且始终遇到无法跟踪的编译器错误。

我正在遵循此页面上的“元组”示例(尽管我将对象称为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,该软件应该完全支持模板编程和可变参数模板。

您了解什么是编译器错误,可以向我解释一下吗?

迪特玛·库尔(DietmarKühl)

直接的问题是您正在定义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 ++编译器只是为了测试模板代码(我通常使用gccclang英特尔的编译器)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

静态const成员变量,可变参数模板和&&的编译器错误或正确行为

编译器无法推断可变参数模板的模板参数

内部编译器错误:gcc中的分段错误。发送可变参数模板到结构时

为什么Clang ++编译器无法编译以下可变参数模板代码?

C ++模板元编程,带有可变参数模板以执行结构中特定成员的操作

C ++将模板参数包从一个可变参数模板传递到另一个可变参数模板会导致编译器错误

编译器跳过C ++中的可变参数模板/函数

可变参数模板和函数的指针:哪种编译器正确?

是编译器还是我自己:从包含lambda的可变参数模板继承

具有模板函数名称的可变参数模板

具有相同类型的可变参数模板参数的构造函数无法编译

模板模板参数和模板别名:编译器错误?

具有功能类型参数的模板导致编译器错误

具有编译问题的简单(递归)可变参数模板“ accumulate_for”函数

具有可变参数模板参数的函数指针

具有const引用的可变参数模板

具有双打的C ++可变参数模板

C ++创建具有可变参数模板方法的接口

具有可变参数模板的成员函数指针

具有元组的C ++可变参数模板

如何具有类型和大小的可变参数模板?

具有递归继承并使用声明的可变参数模板

可变参数模板对

gcc 4.7.2错误可变参数模板

如何使用此模板使用可变参数模板变量来解决我的编译错误

无法使用元编程在可变参数模板中声明变量

具有std :: enable_if的C ++可变参数模板部分模板专业化

具有单个参数模板的成员函数包装器?

如何检查所有可变参数模板参数是否都具有特殊功能?