2012-07-18 111 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

相关问题