在回答中this https://stackoverflow.com/questions/6734492/c-callback-to-function-template-explicitly-instantiate-template问题,我发现了模板实例化方面的行为差异。
最初有一个函数模板
template <typename T> void my_callback(void* data) { … }
现在有些东西需要这个的地址 - 特别是void*
,所以显而易见的方法是
bar(reinterpret_cast<void*>(&my_callback<int>));
但是,对于 gcc 4.5 之前的编译器版本,此操作会失败并出现 not-enough context... 错误。很好 - 所以解决方法是首先“强制转换” - 这会强制实例化,即:
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));
所以我的问题是 - 为什么行为上会出现这种明显的差异?