从模板类调用variadic参数函数

ds1*_*848 5 c++ gcc variadic-templates c++11

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

 foo<T, I...>().run()
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*itb 6

去收集代表......

foo<T>().template run<I...>();
Run Code Online (Sandbox Code Playgroud)

看看我在哪里以及为什么要放置"template"和"typename"关键字?为什么需要模板关键字.