Этот код
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 кажутся мне очень странными. Судя по сообщению об ошибке, дополнительная квалификация не дает никакой информации, которую компилятор все равно не знает.