从模板类调用variadic参数函数

时间:2012-04-02 05:10:21

标签: c++ gcc c++11 variadic-templates

我有一个带有可变参数模板成员函数的模板类,我无法从类外部调用。这是我想要做的简化示例:

template<typename T>
struct foo{
    foo(){}

    template<int... I>
    int run(){
        return sizeof...(I); // or whatever
    }
};

template<int... I>
int run_int(){
    return foo<int>().run<I...>();  // OK
}

template<typename T, int... I>
int run_T(){
    return foo<T>().run<I...>(); // error
}

当foo是专用的时候,我可以调用它的模板成员函数run()而没有任何问题。但是如果我尝试从不专门化foo的函数或结构中调用它,gcc(4.7)会发出一个错误,说“参数包没有用'...'扩展”。我用clang(3.1)尝试了同样的事情,但得到了类似的错误(“错误:表达式包含未展开的参数包'我'”)。

任何人都可以帮助我理解为什么最后一个函数无法编译?现在我可以通过使“int ... I”成为foo本身的非类型参数来解决它,然后从外部调用它:

 foo<T, I...>().run()

但我仍然感到困惑的是为什么它不会以其他方式编译。

1 个答案:

答案 0 :(得分:6)

去收集代表...

foo<T>().template run<I...>();

请参阅Where and why do I have to put the "template" and "typename" keywords?了解为何需要模板关键字。