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;

gccで動作しますが、VisualStudio2010では動作しません。

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;
4

1 に答える 1

0

標準B<A,&f<char> > y;ではありませんか?

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);
}
于 2012-07-18T16:47:48.037 に答える