首页 文章

从模板类调用variadic参数函数

提问于
浏览
5

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

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)尝试了同样的事情,但得到了类似的错误(“错误:表达式包含未展开的参数包'I'”) .

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

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

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

1 回答

相关问题