我有一个带有可变参数模板成员函数的模板类,我无法从类外部调用。这是我想要做的简化示例:
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()
但我仍然感到困惑的是为什么它不会以其他方式编译。
答案 0 :(得分:6)
去收集代表...
foo<T>().template run<I...>();
请参阅Where and why do I have to put the "template" and "typename" keywords?了解为何需要模板关键字。