此代码
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
执行以下任一操作后,错误消失:
使用call
或A::
限定A<T>::
的模板参数,即使用call<A::static_func>()
代替call<static_func>()
。
删除A
的模板参数,即将A
设为非模板类。
使static_func()
成为一个全局函数(使用外部链接)。
为什么上面的代码错了?为什么上面提到的修复工作?特别是1和2对我来说似乎很奇怪。从错误消息判断,额外的限定似乎并没有提供编译器不知道的任何信息。