次のコードがあるとします
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で動作しますが、VisualStudio2010では動作しません。
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;