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:
calificar la parámetro de plantilla de
call
conA::
oA<T>::
, es decir, usecall<A::static_func>()
en lugar decall<static_func>()
.Elimine el parámetro de plantilla de
A
, es decir, haga deA
una clase que no sea de plantilla.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.
La primera alternativa es la correcta que diría. –
@JoachimPileborg: Por supuesto, eso es lo que estoy usando por ahora. Solo me gustaría entender qué está pasando aquí. –
Parece que podría tener algo que ver con la implementación del compilador de búsqueda de dos fases o algo así. – bames53