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