假设您有以下代码

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。

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;

最佳答案

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);
}

07-24 09:44
查看更多