2011-11-14 4 views
12

Questo codiceCome utilizzare un puntatore a funzione su una funzione membro statica come parametro di modello?

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() {} 

risultati nel seguente messaggio di errore (GCC 4.4.5):

test.cc:6: error: 'static void A<T>::static_func() [with T = int]' 
        cannot appear in a constant-expression 

L'errore scompare dopo aver fatto una delle seguenti operazioni:

  1. Qualificare il parametro modello di call con A:: o A<T>::, ovvero utilizzare call<A::static_func>() anziché call<static_func>().

  2. Rimuovere il parametro di modello di A, ovvero rendere A una classe non modello.

  3. Effettuare static_func() una funzione globale (con collegamento esterno).

Perché il codice sopra riportato è sbagliato? E perché funzionano le correzioni menzionate? Soprattutto 1 e 2 mi sembrano molto strani. A giudicare dal messaggio di errore, la qualifica aggiuntiva non sembra fornire alcuna informazione che il compilatore non sappia comunque.

+0

La prima alternativa è quella giusta che vorrei dire. –

+2

@JoachimPileborg: Questo è ovviamente quello che sto usando per ora. Mi piacerebbe solo capire cosa sta succedendo qui. –

+0

Sembra che potrebbe avere qualcosa a che fare con l'implementazione del compilatore della ricerca in due fasi o qualcosa del genere. – bames53

risposta

5

Questo è un bug in GCC.

+1

Grazie. È rassicurante che almeno una volta il compilatore è sbagliato, non io. :) –