假设您有以下代码
template<typename T,void (T::*m)(int)>
struct B{
void f(T* a,int x){
(a->*m)(x);
}
};
struct A{
template<typename X> void f(int){
}
void wrap(int i){
f<char>(i);
}
B<A,&A::f<char> > y;
};
int main(){
A a;
}
这个定义
B<A,&A::f<char> > y;
适用于 gcc,但不适用于 Visual Studio 2010:
error C2440: 'specialization' : cannot convert from 'overloaded-function' to 'void (__thiscall A::* )(int)'
相反,
B<A,&f<char> > y;
适用于视觉工作室,但不适用于 gcc。
注意 B<A,&A::f<char> > y;
放在main中,即
int main(){
B<A,&A::f<char> > y;
}
也适用于 VS。
不 B<A,&f<char> > y;
标准吗?有没有办法(除了包装模板函数)让这两个编译器都能编译?
===编辑====
一个可能的,肮脏的解决方案是
#ifdef _WIN32
#define vsFix(a,b) b
#else
#define vsFix(a,b) a::b
#endif
B<A,&vsFix(A,f)<char> > y;