假设您有以下代码
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;
适用于Visual Studio,但不适用于GCC。
请注意
B<A,&A::f<char> > y;
放置在主体中,即 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;
最佳答案
B<A,&f<char> > y;
不是标准的吗?
不。&f<char>
是指向函数的指针,而不是指向成员函数的指针。
有没有办法(除了包装模板函数)使事物在两个编译器中都能编译?
是的,通过固定类型并将指针传递给A类型的对象:
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){
y.f(this, i);
}
B< A, &A::f<int> > y;
};
int main(){
A a;
a.wrap(5);
}