【问题标题】:Template Meta-programming, with Variadic Templates: compiler error模板元编程,带有可变参数模板:编译器错误
【发布时间】:2014-12-15 15:30:23
【问题描述】:

我是第一次尝试可变参数模板元编程,但一直遇到我无法追踪的编译器错误。

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

你了解编译器错误是什么吗,能解释一下吗?

【问题讨论】:

  • 添加缺少的主模板template&lt;int, class T&gt; struct type_holder; 并修正错字typeholder -> type_holder
  • 按照建议的答案更新问题,但仍然有不同的错误......
  • 什么不同的错误
  • “编译器错误”非常模糊。大多数编译器可能会产生数百甚至数千种不同的错误/警告消息。不要让我们猜测你得到的是哪一个......
  • 现在您的主模板中缺少int,请关注Dietmar Kühl's 回答

标签: c++ templates variadic-templates


【解决方案1】:

直接的问题是您正在定义 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++ 编译器来测试模板代码(我通常使用 gccclangIntel's compiler)。

【讨论】:

  • 你想让某人™ 用 Visual c++ 2013 来尝试吗?
  • 主模板只能有一个类型参数,而不是整个包
  • 这个似乎有效。谢谢!我需要仔细比较才能找出它与我自己的代码有很大不同的地方。
  • @abelenky:我刚刚添加了一个主模板声明 (template &lt;int, typename&gt; struct type_holder;) 并将一个 typeholder 更改为 type_holder
猜你喜欢
  • 2018-07-31
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多