如何使用指向静态成员函数的函数指针作为模板参数?

时间:2011-11-14 15:00:13

标签: c++ templates function-pointers

此代码

template <void (*func)()>
static void call() { func(); }

template <typename T>
struct A {
    A() { call<static_func>(); }   // <--- error
    static void static_func() {}
};

A<int> a;

int main() {}

导致以下错误消息(gcc 4.4.5):

test.cc:6: error: 'static void A<T>::static_func() [with T = int]'
                   cannot appear in a constant-expression

执行以下任一操作后,错误消失:

  1. 使用callA::限定A<T>::的模板参数,即使用call<A::static_func>()代替call<static_func>()

  2. 删除A的模板参数,即将A设为非模板类​​。

  3. 使static_func()成为一个全局函数(使用外部链接)。

  4. 为什么上面的代码错了?为什么上面提到的修复工作?特别是1和2对我来说似乎很奇怪。从错误消息判断,额外的限定似乎并没有提供编译器不知道的任何信息。

1 个答案:

答案 0 :(得分:5)

这是bug in GCC