【发布时间】: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<int, class T> struct type_holder;并修正错字typeholder->type_holder -
按照建议的答案更新问题,但仍然有不同的错误......
-
什么不同的错误?
-
“编译器错误”非常模糊。大多数编译器可能会产生数百甚至数千种不同的错误/警告消息。不要让我们猜测你得到的是哪一个......
-
现在您的主模板中缺少
int,请关注Dietmar Kühl's 回答
标签: c++ templates variadic-templates