Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板函数作为模板参数,标准是什么?_C++_Visual Studio_G++ - Fatal编程技术网

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

C++ 模板函数作为模板参数,标准是什么?,c++,visual-studio,g++,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,&am

假设您有以下代码

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,&f<char> > y;
使用visual studio,但不使用gcc

注意B y;放在主要位置,即

  int main(){
       B<A,&A::f<char> > y;
    }
也适用于VS

是B y;不标准?是否有一种方法可以分开包装模板函数,使它同时使用两个编译器进行编译

==编辑====

一个可能的、肮脏的解决方案是

#ifdef _WIN32
#define vsFix(a,b) b
#else
#define vsFix(a,b) a::b
#endif

 B<A,&vsFix(A,f)<char> > y;
是B y;不标准

否。&f是指向函数的指针,而不是指向成员函数的指针

是否有一种方法可以分开包装模板函数,使它同时使用两个编译器进行编译

是,通过固定类型并将指针传递到类型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);
}

我想建议您签出std::function并使用它来传递函数。@Bааћ:这在VS 2010中不会编译,但我想知道编译函数是否真的有缺陷。@stdOrgnlDave谢谢,这可能是一个很好的方向,尽管它引入了C++11,不是吗?@FabioDallaLibera抱歉,我还没有尝试编译。上面的代码编译得很好。但正如所建议的,您可以使用lambdas和std::function只是为了读者的理智,您应该在不同的编译器中发布编译/不编译的实际代码片段,即,而不是说*B y;放在VS的主要工作中,将其作为测试代码的一部分添加
#ifdef _WIN32
#define vsFix(a,b) b
#else
#define vsFix(a,b) a::b
#endif

 B<A,&vsFix(A,f)<char> > y;
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);
}