【发布时间】:2015-12-30 02:04:49
【问题描述】:
我正在尝试按位置与相机的距离升序对网格的 std::vector (每个都有自己的变换类和位置)进行排序(预定义的 Vec3)。
== 渲染列表.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;
}
== 渲染列表.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> 的std::sort 函数的比较参数来告诉它如何排序列表(通过距相机位置的距离),但是我用于在我将其compare() 函数用作参数之前,需要实例化比较。
可以在以下位置找到类似于我正在尝试做的示例:cplusplus.com 编译时出现以下错误:
renderlist.cpp:在成员函数“ObjectList RenderList::getOrderedObjectList()”中:renderlist.cpp:32:49:错误: 没有匹配函数调用'sort(std::vector::iterator, std::vector::iterator, )' std::sort(temp.begin(), temp.end(), rlc.compare); ^我的猜测是我试图模仿上面的链接来实现类似的效果,但是之前向结构添加了额外的信息,这可能会导致我的语法错误。
【问题讨论】:
-
从比较类中移除数据成员和构造函数开始。将实例传递给排序函数。
-
@Cheersandhth.-Alf:数据成员和构造函数有什么问题?
-
@Cheers 和 hth。 - Alf:我发现将比较函数重命名为 operator()(Object* obj1, Object* obj2) 并将 RLC 结构的实例传递给 sort 可以完美地完成这项工作。感谢您的帮助。
-
@LightnessRacesinOrbit:除了支持 OP 的一些混乱之外,它们没有任何用途。当它们被删除时,这种混乱有望减少。
-
@Cheersandhth.-Alf:您似乎误解了代码。数据成员和构造函数绝对没有错。比较器是“在提供的两个对象中,哪个对象离最远?”.
标签: c++