Как использовать указатель на функцию-член в качестве параметра шаблона? - PullRequest
12 голосов
/ 14 ноября 2011

Этот код

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. Квалифицировать параметр шаблона call с A:: или A<T>::, т. Е. Использовать call<A::static_func>() вместо call<static_func>().

  2. Удалите параметр шаблона из A, то есть сделайте A не шаблонным классом.

  3. Сделать static_func() глобальной функцией (с внешней связью).

Почему вышеуказанный код неправильный? И почему упомянутые исправления работают? Особенно 1 и 2 кажутся мне очень странными. Судя по сообщению об ошибке, дополнительная квалификация не дает никакой информации, которую компилятор все равно не знает.

1 Ответ

5 голосов
/ 14 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...