模板函数作为模板参数,标准是什么?

时间:2012-07-18 16:39:16

标签: c++ visual-studio g++

假设您有以下代码

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.

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 个答案:

答案 0 :(得分:0)

  

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