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:
Qualificare il parametro modello di
call
conA::
oA<T>::
, ovvero utilizzarecall<A::static_func>()
anzichécall<static_func>()
.Rimuovere il parametro di modello di
A
, ovvero rendereA
una classe non modello.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.
La prima alternativa è quella giusta che vorrei dire. –
@JoachimPileborg: Questo è ovviamente quello che sto usando per ora. Mi piacerebbe solo capire cosa sta succedendo qui. –
Sembra che potrebbe avere qualcosa a che fare con l'implementazione del compilatore della ricerca in due fasi o qualcosa del genere. – bames53