3D矢量和常量

时间:2016-01-07 07:22:13

标签: c++ c++11

我正在实现一个函数,它接收3个向量:

mat4 lookAt(const vec3 &eye, const vec3 &centre, const vec3 &up);

当我想做一些矢量数学时会出现问题:

auto s = centre - eye; // won't compile
auto a = s.normalise();

当尝试编译s时,编译器会抛出此错误:

error: passing ‘const vec3’ as ‘this’ argument discards qualifiers [-fpermissive]

这就是我在vec3类中实现减法器重载的方法:

vec3 vec3::operator -(const vec3& v)
{
    *this -= v;
    return *this;
}

最终来自:

vec3& vec3::operator -=(const vec3& v)
{
    this->x -= v.x;
    this->y -= v.y;
    this->z -= v.z;

    return *this;
}

我不确定导致编译器错误的原因是什么,所以:

  1. 我将auto更改为显式类型,以const为前缀;例如const vec3 a = s.normalise();。这不起作用。

  2. 它可能与减法器重载有关,它会返回一个参考。

  3. 我检查了我的复制构造函数,我的赋值重载 - 它们都运行正常;两者都用在其他代码中并按预期工作。

    您也知道,lookAt函数已在实现文件中声明并实现。它既不是类的成员,也不是头文件中使用的。可能会混淆编译器吗?

    我需要第三只眼,因为我无法弄清楚错误的确切背景!

2 个答案:

答案 0 :(得分:4)

编译错误的原因是const不是const,而是通过const引用应用它。只能通过const引用将vec3 vec3::operator -(const vec3& v) const ^^^^^ 个成员应用于对象。签名需要

this

然后你需要修改实现,使其不会修改a - b,它永远不应该做(a不应该修改bvec3 vec3::operator -(const vec3& v) const { vec3 res = *this; res -= v; return res; } ) 。例如,

operator-

请注意,习惯上将vec3 operator-(const vec3& lhs, const vec3& rhs) { vec3 res = lhs; res -= rhs; return rhs; } 实现为非成员,以使RHS和LHS操作数的对称处理对称:

{{1}}

答案 1 :(得分:2)

- operator的实施存在问题。在实现中,您正在更改不正确的this的值。当你减去两个变量时,你不会改变它们中的任何一个。因此,当auto s = centre - eye;尝试编辑centre时,您会减去const- operator - operator,从而导致错误。

这是重载vec3 vec3::operator -(const vec3& v) const { vec3 temp; temp.x=this->x-v.x; temp.y=this->y-v.y; temp.z=this->z-v.z; return temp; } 的正确方法:

system("net use x: \\\\ServerName\\sharename /user:username password")