我正在实现一个函数,它接收3个向量:
mat4 lookAt(const vec3 &eye, const vec3 ¢re, 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;
}
我不确定导致编译器错误的原因是什么,所以:
我将auto
更改为显式类型,以const为前缀;例如const vec3 a = s.normalise();
。这不起作用。
它可能与减法器重载有关,它会返回一个参考。
我检查了我的复制构造函数,我的赋值重载 - 它们都运行正常;两者都用在其他代码中并按预期工作。
您也知道,lookAt
函数已在实现文件中声明并实现。它既不是类的成员,也不是头文件中使用的。可能会混淆编译器吗?
我需要第三只眼,因为我无法弄清楚错误的确切背景!
答案 0 :(得分:4)
编译错误的原因是const
不是const
,而是通过const
引用应用它。只能通过const
引用将vec3 vec3::operator -(const vec3& v) const
^^^^^
个成员应用于对象。签名需要
this
然后你需要修改实现,使其不会修改a - b
,它永远不应该做(a
不应该修改b
或vec3 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")