为什么我不能将此参数用于比较std :: sort()?

时间:2015-12-30 02:04:50

标签: c++

我正在尝试按照它们相机的位置(预定义的Vec3)的升序排序网格的std :: vector(每个都有自己的变换类,因此位置)。

== renderlist.hpp ==
//Includes & guard omitted

typedef std::vector<Object*> ObjectList;
class RenderList
{
public:
    RenderList(Object** objects, unsigned int numObjs, Camera& camRef);
    ObjectList getOrderedObjectList();
    void renderInOrder(Shader& master);
private:
    ObjectList unorderedList;
    Camera* cameraReference;
}
== renderlist.cpp ==
struct RenderListCompare
{
    Vec3 cp;
    RenderListCompare(Vec3 camPos)
    {
        cp = camPos;
    }
    bool compare(Object* obj1, Object* obj2)
    {
        Vec3 pos1 = obj1->getTransform().getTranslate();
        Vec3 pos2 = obj2->getTransform().getTranslate();
        return (pos1.distance(cp) > pos2.distance(cp));
    }
};

RenderList::RenderList(Object** objects, unsigned int numObjs, Camera& camRef)
{
    for(unsigned int i = 0; i < numObjs; i++)
    {
        this->unorderedList.push_back(objects[i]);
    }
    this->cameraReference = &camRef;
}

void RenderList::getOrderedObjectList()
{
    ObjectList temp = this->unorderedList;
    RenderListCompare rlc(this->cameraReference->getPos());
    std::sort(temp.begin(), temp.end(), rlc.compare);
    return temp;
}

这里的问题是我正在尝试使用<algorithm>的{​​{1}}函数的Compare参数告诉它如何订购列表(通过相机位置的距离),但结构I'在使用std::sort函数作为参数之前,用于比较的m需要实例化。

可以在以下位置找到类似于我正在尝试的示例:cplusplus.com 我在编译时遇到以下错误:

    renderlist.cpp: In member function 'ObjectList RenderList::getOrderedObjectList()': renderlist.cpp:32:49: error:
    no matching function for call to 'sort(std::vector::iterator, std::vector::iterator, )'
        std::sort(temp.begin(), temp.end(), rlc.compare);
                                               ^

我的猜测是我试图模仿上面的链接来实现类似的效果,但之前向结构中添加了额外的信息,这可能会导致代表我的语法错误。

1 个答案:

答案 0 :(得分:2)

这不是比较器如何工作的。将您的compare会员功能更改为operator() ...

struct RenderListCompare
{
   RenderListCompare(const Vec3& camPos)
      : cp(camPos)
   {}

   bool operator()(const Object* obj1, const Object* obj2)
   {
      Vec3 pos1 = obj1->getTransform().getTranslate();
      Vec3 pos2 = obj2->getTransform().getTranslate();
      return (pos1.distance(cp) > pos2.distance(cp));
   }

private:
   const Vec3 cp;
};

...只需将RenderListCompare对象传递给std::sort,而不是自己命名成员函数。

std::sort(
   temp.begin(),
   temp.end(),
   RenderListCompare(this->cameraReference->getPos())
);