Отвечая на этот вопрос, я столкнулся с этой разницей в поведении в отношении создания шаблона.
Изначально существует шаблон функции
template <typename T> void my_callback(void* data) { … }
Теперь что-то требует адрес этого - в частности, void*
, поэтому очевидный подход -
bar(reinterpret_cast<void*>(&my_callback<int>));
Однако в версиях компилятора, предшествующих gcc 4.5, это завершается ошибкой с недостаточным контекстом ... ошибка. Прекрасно - так что исправление - это сначала «сотворение», что заставляет инстанцировать, то есть:
void (*callback)(void*) = my_callback<int>;
bar(reinterpret_cast<void*>(callback));
Это отлично работает.
Теперь второй сценарий, вместо того, чтобы быть свободной функцией, это статический член шаблона класса, т.е.
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;
}
};
Теперь оригинал reinterpret_cast
работает нормально.
bar(reinterpret_cast<void*>(&foo<int>::my_callback));
Итак, мой вопрос - почему эта очевидная разница в поведении?