使用函数指针时c++模板编译错误

c++ template compiling error when using function pointers

本文关键字:编译 错误 c++ 函数 指针      更新时间:2023-10-16

我得到以下代码的编译错误:

定义一个新的类型函数指针,由于某种语义原因,我必须用结构体包装它:

template<typename T>
struct sparseDistance{
    typedef float (*sparseDistanceCore)(typename std::vector<colcell<T> >::iterator, 
        typename std::vector<colcell<T> >::iterator, unsigned, unsigned, unsigned, T);
};

下面的函数是引用3个函数:sparseDistanceEuc, sparseDistanceCheb和sparseDistanceCB

template<typename T>
typename sparseDistance<T>::sparseDistanceCore getDistanceFun(std::string& ms)
{
  if(ms=="Euc")return &sparseDistanceEuc;
  else if(ms=="Cheb")return &sparseDistanceCheb;
  return &sparseDistanceCB;
}

在主事件函数定义中:

template<typename T>
std::vector<float> sparsePairColDInternal(std::vector<std::vector<colcell<T> > >&M, 
    std::string&metric, typename T specialValue=0){
typename sparseDistance<T>::sparseDistanceCore D=
    getDistanceFun<typename sparseDistance<T>::sparseDistanceCore>(metric);
//...Do the rest steps
}

在main()函数中,我将类型(T)初始化为double。然后编译器给出以下错误:

distanceFuntion.cpp(187): error C2440: 'initializing' : cannot convert from     'float (__cdecl *)    (std::_Vector_iterator<_Myvec>,std::_Vector_iterator<_Myvec>,unsigned int,unsigned int,unsigned int,T)' to 'float (__cdecl *)(std::_Vector_iterator<_Myvec>,std::_Vector_iterator<_Myvec>,unsigned int,unsigned int,unsigned int,T)'
      with
      [
          _Myvec=std::_Vector_val<std::_Simple_types<colcell<float (__cdecl *)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<colcell<double>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<colcell<double>>>>,unsigned int,unsigned int,unsigned int,double)>>>,
          T=float (__cdecl *)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<colcell<double>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<colcell<double>>>>,unsigned int,unsigned int,unsigned int,double)
      ]
      and
      [
          _Myvec=std::_Vector_val<std::_Simple_types<colcell<double>>>,
          T=double
      ]
      This conversion requires a reinterpret_cast, a C-style cast or function-style cast
      distanceFuntion.cpp(234) : see reference to function template instantiation 'std::vector<_Ty> sparsePairColDInternal<T>(std::vector<std::vector<colcell<T>>> &,std::string &,T)' being compiled
      with
      [
          _Ty=float,
          T=double
      ]
      distanceFuntion.cpp(324) : see reference to function template instantiation 'std::vector<_Ty> sparsePairColDNoneBin<double>(std::vector<sparseColumn<T>> &,std::string &,T)' being compiled
      with
      [
          _Ty=float,
          T=double
      ]

有人能帮忙吗?

谢谢!

在我看来就像sparsePairColDInternal中的这一行:

typename sparseDistance<T>::sparseDistanceCore D=
getDistanceFun<typename sparseDistance<T>::sparseDistanceCore>(metric);
应:

typename sparseDistance<T>::sparseDistanceCore D=
getDistanceFun<T>(metric);

否则getDistanceFun的类型看起来像这样:

typename sparseDistance<sparseDistance<T>::sparseDistanceCore>::sparseDistanceCore getDistanceFun(std::string& ms)