假設你有下面的代碼模板函數作爲模板參數,標準是什麼?
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;
作品與海灣合作委員會,但不與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;
只是爲了讀者的理智,你應該張貼的代碼的實際塊是編譯/不中不同的編譯器(也就是說,而不是說*'B > y;'放在'main'中用於VS,添加作爲測試代碼的一部分 – 2012-07-18 16:53:55