假设您有以下代码
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.
IS B<A,&f<char> > y;
不标准吗?是否有一种方法(除了包装模板函数)以使用两个编译器进行编译?
=== EDIT ====
可能的,肮脏的解决方案
#ifdef _WIN32
#define vsFix(a,b) b
#else
#define vsFix(a,b) a::b
#endif
B<A,&vsFix(A,f)<char> > y;
答案 0 :(得分:0)
IS
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);
}