我正在尝试按照它们相机的位置(预定义的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); ^
我的猜测是我试图模仿上面的链接来实现类似的效果,但之前向结构中添加了额外的信息,这可能会导致代表我的语法错误。
答案 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())
);