表达式:无效的运算符< - 找不到错误

时间:2013-07-04 21:35:54

标签: c++ directx compare operator-overloading directx-11

if(!projectiles.empty()){
        sort(projectiles.rbegin(), projectiles.rend()); //Occasionally I get bad sort error. No idea why.
    }
射弹是一种充满抛射物结构的std :: vector。如果执行“fire”命令,则在每个帧中添加这些,如果超时,则自动删除每个帧。

在射弹中:

bool operator < (const projectile& proj) const
{
    return (D3DXVec3Dot(&pos, p_camera.GetWorldAhead()) < D3DXVec3Dot(&proj.pos, p_camera.GetWorldAhead()));
}

... pos是一个D3DXVECTOR3,它具有射弹在3D空间中的位置 - 可以工作(分类用于在alpha混合时进行深度检查)。对于那些想知道的人,D3DXVec3Dot返回一个浮点数。但有时候,特别是屏幕上有很多射弹,它会抛出:

  

Debug Assertion失败!

     

程序:C:\ Windows \ system32 \ MSVCP110D.dll文件:   e:\ applications \ vc \ include \ algorithm行:3566

     

表达式:无效的运算符&lt;

     

有关程序如何导致断言失败的信息,   请参阅关于断言的Visual C ++文档。

不确定原因。任何帮助深表感谢。

3 个答案:

答案 0 :(得分:1)

我知道,这不是一个正确的答案,但评论的时间太长了。

错误消息表明比较不一致 - sort函数希望每次都以相同的方式保持相同的值。如果它检测到两个相同值的比较产生相反的结果,则会抛出此错误。我怀疑你的比较是错误的,或者内部计算在不同时间给出不同的结果(例如,射弹被移动)。

鉴于您有时只获得它,它表示竞争条件或导致结果不稳定的小计算错误。

并确认在排序时,相机或射弹没有移动 - 如果其中一个或两个在排序过程中移动,您将永远无法解决此问题。

答案 1 :(得分:0)

我通过在帧开始时将每个结构的距离保存在自己的变量中一次,然后比较那些 - 这样就没有出现竞争条件的机会,从而解决了这个问题。谢谢提醒伙计。 :)

答案 2 :(得分:0)

您还可以在调用sort之前添加简单检查您的矢量是否已经排序。在我的情况下,它帮助了我。