2012-07-18 158 views
1

假設你有下面的代碼模板函數作爲模板參數,標準是什麼?

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; 
+1

只是爲了讀者的理智,你應該張貼的代碼的實際塊是編譯/不中不同的編譯器(也就是說,而不是說*'B > y;'放在'main'中用於VS,添加作爲測試代碼的一部分 – 2012-07-18 16:53:55

回答

0

B<A,&f<char> > y; IS不標準?

No. &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); 
} 
+0

我想建議您檢出std :: function並使用它來傳遞函數 – 2012-07-18 16:53:15

+0

@BЈовић:這不能在VS 2010中編譯,但我不知道編譯函數是否真的是buggy然後 @ std'' OrgnlDave謝謝,這可能是一個很好的方向,雖然它會引入C++ 11,不是嗎? – 2012-07-18 16:56:21

+0

@FabioDallaLibera對不起,我還沒有試過編譯。上面的代碼編譯得很好。但如所暗示的,你可以使用lambdas和std :: function – 2012-07-18 18:57:40

相關問題