Al responder la pregunta this, me encontré con esta diferencia de comportamiento con respecto a la creación de instancias de plantillas.¿Cuáles son las reglas en torno a la instanciación de tipos de plantilla (clase/función) cuando se toma una dirección?
Inicialmente hay una plantilla de función
template <typename T> void my_callback(void* data) { … }
Ahora algo requiere la dirección de este - en concreto un void*
, por lo que el enfoque obvio es
bar(reinterpret_cast<void*>(&my_callback<int>));
Sin embargo, con las versiones del compilador pre gcc 4.5, esto falla con un contexto no suficiente ... error. Bien - por lo que la solución es "fundido" en primer lugar - lo que obliga a instancias, es decir:
void (*callback)(void*) = my_callback<int>;
bar(reinterpret_cast<void*>(callback));
Esto funciona bien.
Ahora el segundo escenario, en lugar de ser una función gratuita, es un miembro estático de una plantilla de clase, es decir
template <typename T>
struct foo
{
static void my_callback(void* data) {
T& x = *static_cast<T*>(data);
std:: cout << "Call[T] with " << x << std::endl;
}
};
Ahora, el original reinterpret_cast
funciona bien.
bar(reinterpret_cast<void*>(&foo<int>::my_callback));
Así que mi pregunta es: ¿por qué esta aparente diferencia en el comportamiento?
lol ... tomando prestado de una pregunta bastante reciente que veo :) +1, la pregunta es realmente interesante. –