2011-11-14 19 views
12

Este código¿Cómo usar un puntero de función para una función de miembro estático como un parámetro de plantilla?

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

resultados en el siguiente mensaje de error (gcc 4.4.5): desaparece

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

El error después de hacer cualquiera de las siguientes:

  1. calificar la parámetro de plantilla de call con A:: o A<T>::, es decir, use call<A::static_func>() en lugar de call<static_func>().

  2. Elimine el parámetro de plantilla de A, es decir, haga de A una clase que no sea de plantilla.

  3. Realice static_func() una función global (con enlace externo).

¿Por qué el código anterior es incorrecto? ¿Y por qué funcionan las soluciones mencionadas? Especialmente 1 y 2 me parecen muy extraños. A juzgar por el mensaje de error, la calificación adicional no parece proporcionar ninguna información que el compilador no sepa de todos modos.

+0

La primera alternativa es la correcta que diría. –

+2

@JoachimPileborg: Por supuesto, eso es lo que estoy usando por ahora. Solo me gustaría entender qué está pasando aquí. –

+0

Parece que podría tener algo que ver con la implementación del compilador de búsqueda de dos fases o algo así. – bames53

Respuesta

5

Esto es bug in GCC.

+1

Gracias. Es tranquilizador que al menos una vez que el compilador está equivocado, yo no. :) –

Cuestiones relacionadas