C++ 将'std::sort'与模板类中的成员函数一起使用

C++ 将'std::sort'与模板类中的成员函数一起使用,c++,class,templates,function-pointers,typedef,C++,Class,Templates,Function Pointers,Typedef,我遇到的问题是,我想在模板化类中使用STL的排序和自定义比较函数 使用typedef的想法来自另一个方面 无论如何,代码如下: template <typename R,typename S> class mesh{ /* some stuff */ void sortData(){ typedef bool (*comparer_t)(const S,const S); comparer_t cmp = &mesh::compareEdgesFro

我遇到的问题是,我想在模板化类中使用STL的排序和自定义比较函数

使用typedef的想法来自另一个方面

无论如何,代码如下:

template <typename R,typename S>
class mesh{
  /* some stuff */

  void sortData(){
    typedef bool (*comparer_t)(const S,const S);
    comparer_t cmp = &mesh::compareEdgesFromIndex;
    sort(indx,indx+sides*eSize,cmp);
  }

  /* more stuff */

  // eData and cIndx are member variables
  bool compareEdgesFromIndex(const S a,const S b){
    return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]); 
  }
};
模板
类网格{
/*一些东西*/
void sortData(){
类型定义布尔(*比较器)(常数S,常数S);
comparer\u t cmp=&mesh::compareEdgesFromIndex;
排序(indx、indx+边*eSize、cmp);
}
/*更多的东西*/
//eData和cIndx是成员变量
布尔比较FromIndex(常数S a,常数S b){
返回比较表(eData[cIndx[2*a]]、eData[cIndx[2*a+1]]、eData[cIndx[2*b]]、eData[cIndx[2*b+1]];
}
};
我得到的错误是

mesh.h:130:29: error: cannot convert ‘bool (mesh<float, unsigned int>::*)(unsigned int, unsigned int)’ to ‘comparer_t {aka\
bool (*)(unsigned int, unsigned int)}’ in initialization
mesh.h:130:29:错误:无法将'bool(mesh::*)(unsigned int,unsigned int)'转换为'comparer_t{aka'\
初始化中的bool(*)(无符号整数,无符号整数)}

提前谢谢你

您必须将
compareEdgesFromIndex
声明为静态:

static bool compareEdgesFromIndex(const S a,const S b){
  return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]); 
}

假设
compareEdges
也是静态的。否则,您有一个成员函数指针,需要调用
mesh
指针。

您必须将
compareEdgesFromIndex
声明为静态:

static bool compareEdgesFromIndex(const S a,const S b){
  return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]); 
}
假设
compareEdges
也是静态的。否则,您有一个成员函数指针,需要调用
mesh
指针。

您试图在需要函数指针的位置混合成员函数指针。您可以将谓词重构为
静态
函数,或者使用绑定将成员函数指针与类
网格
的实例相关联

为了将实例绑定到成员函数指针,您需要

std::bind( mesh_instance, &mesh::compareEdgesFromIndex, _1, _2 )
如果使用C++11。如果您没有奢侈品,那么您可以使用Boost提供的等效功能(将
std::bind
替换为
Boost::bind
C++03提供了一些绑定功能,但它是有限的,我认为现在通用绑定功能已经过时了。

您试图在需要函数指针的地方混合使用成员函数指针。您可以将谓词重构为
静态
函数,或者使用绑定将成员函数指针与类
网格
的实例相关联

为了将实例绑定到成员函数指针,您需要

std::bind( mesh_instance, &mesh::compareEdgesFromIndex, _1, _2 )

如果使用C++11。如果您没有奢侈品,那么您可以使用Boost提供的等效功能(将
std::bind
替换为
Boost::bind
C++03提供了一些绑定功能,但它是有限的,我相信现在通用绑定功能已经过时了。

成员函数不是函数,因为要工作,它还需要知道哪个对象实例正在被操作。静态成员基本上只是一个常规的全局函数,具有有趣的名称和访问类的私有部分的权限

实际上,指向非静态成员函数的指针不是您可以简单调用的对象,而是您可以提供一个对象实例来获取您可以调用的对象


相反,您可以传递类的
std::sort
对象实例,该类实现了一个
::操作符()(int,int)
,给定的两个索引将返回所需的结果。不幸的是,由于我在C++中没有理解过这个对象类必须是非本地类,因为本地类不能在模板中使用(它可以是在另一个类中定义的类,而不是在函数或方法中定义的类)。.

成员函数不是函数,因为要工作,它还需要知道哪个对象实例正在被操作。静态成员基本上只是一个常规的全局函数,具有有趣的名称和访问类的私有部分的权限

实际上,指向非静态成员函数的指针不是您可以简单调用的对象,而是您可以提供一个对象实例来获取您可以调用的对象


相反,您可以传递类的
std::sort
对象实例,该类实现了一个
::操作符()(int,int)
,给定的两个索引将返回所需的结果。不幸的是,由于我在C++中没有理解过这个对象类必须是非本地类,因为本地类不能在模板中使用(它可以是在另一个类中定义的类,而不是在函数或方法中定义的类)。您可以将
boost::bind(this,&mesh::compareEdgesFromIndex,_1,_2)
作为比较器传递。

或者,如果您希望将compareEdgesFromIndex用作非静态成员函数,您可以将
boost::bind(this,&mesh::compareEdgesFromIndex,_1,_2)
作为比较器传递。

作为
std::bind
的替代方法,您可以使用lambda,我更喜欢它,因为我永远记不起
std::bind
的语法

auto cmp = [&mesh_instance](unsigned lhs, unsigned rhs) {
    return mesh_instance.compareEdgesFromIndex(lhs, rhs);
};

作为
std::bind
的替代方法,您可以使用lambda,我更喜欢它,因为我永远记不住
std::bind
的语法

auto cmp = [&mesh_instance](unsigned lhs, unsigned rhs) {
    return mesh_instance.compareEdgesFromIndex(lhs, rhs);
};

谢谢你的回复!当将两者声明为静态时,我得到一个错误,即eData和cIndx的使用无效。您应该了解什么是静态成员函数。显然,您必须修改代码,使其不依赖于实例变量,因为您的方法是静态的(这意味着它某种程度上是一个“全局函数”)。我的回答只是修正了你的错误信息:D.谢谢你的澄清谢谢你的回复!当将两者声明为静态时,我得到一个错误,即eData和cIndx的使用无效。您应该了解什么是静态成员函数。显然,你必须修改