Bei der Beantwortung dieser Frage bin ich auf diesen Unterschied im Verhalten hinsichtlich der Template-Instantiierung gestoßen.
Zunächst gibt es ein Funktions-Template:
template void my_callback(void* data) { … }
Jetzt wird etwas benötigt, was die Adresse davon erfordert - speziell ein void*
, also ist der offensichtliche Ansatz:
bar(reinterpret_cast(&my_callback));
Allerdings schlägt dies mit Compiler-Versionen vor gcc 4.5 fehl, mit einem "not-enough context..." Fehler. In Ordnung - also wird die Lösung sein, zuerst zu "casten" - was die Instantiierung erzwingt, also:
void (*callback)(void*) = my_callback;
bar(reinterpret_cast(callback));
Dies funktioniert gut.
Jetzt das zweite Szenario, anstatt eine freie Funktion zu sein, ist es ein statisches Element einer Klassen-Vorlage, also:
template
struct foo
{
static void my_callback(void* data) {
T& x = *static_cast(data);
std:: cout << "Aufruf[T] mit " << x << std::endl;
}
};
Jetzt funktioniert das originale reinterpret_cast
gut.
bar(reinterpret_cast(&foo::my_callback));
Also meine Frage ist - warum dieser scheinbare Unterschied im Verhalten?