W odpowiedzi na pytanie this natknąłem się na tę różnicę w zachowaniu w odniesieniu do tworzenia szablonu.Jakie są zasady dotyczące tworzenia wystąpień typów szablonów (klasa/funkcja) podczas przyjmowania adresu?
Początkowo jest szablonem funkcji
template <typename T> void my_callback(void* data) { … }
Teraz coś wymaga adres to - konkretnie void*
, więc oczywistym rozwiązaniem jest
bar(reinterpret_cast<void*>(&my_callback<int>));
Jednak z wersji kompilatora pre gcc 4.5, to kończy się niepowodzeniem z niewystarczającym kontekstem ... błędu. Drobne - więc poprawka ma najpierw "odlać", co wymusza utworzenie, tj .:
void (*callback)(void*) = my_callback<int>;
bar(reinterpret_cast<void*>(callback));
To działa dobrze.
Teraz drugi scenariusz, zamiast bycia wolną funkcję, to statyczne członek szablonu klasy, tj
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;
}
};
Teraz, oryginalny reinterpret_cast
działa dobrze.
bar(reinterpret_cast<void*>(&foo<int>::my_callback));
Moje pytanie brzmi - dlaczego ta widoczna różnica w zachowaniu?
lol ... zapożyczam z dość niedawnego pytania, które widzę :) +1, pytanie jest rzeczywiście interesujące. –