Подтвердить что ты не робот

Как использовать указатель функции для статической функции-члена в качестве параметра шаблона?

Этот код

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

4b9b3361

Ответ 1

Это ошибка в GCC.