0

我写了一个小的 3d 矢量类。特别是我写了两个函数,一个用于旋转向量,一个用于返回向量本身的旋转副本。所以我有以下内容:

Vector Vector::Rotate(const double angle, Vector& axis) const {
Vector b=*this;
b.Rotate(angle,axis);
return (b);
}

void Vector::Rotate(const double angle, Vector & axis) {

/* let's promote this vector to a quaternion */
Quaternion V (0,*this);

/* quaternion describing the rotation */
Quaternion q (cos(angle/2),axis*sin(angle/2));

/* actual rotation  */
*this = (q*V*q.conjugate()).Vec();
}

现在,当我写这样的东西时:

 vector2 = vector1.Rotate(rbo::M_PUCKER,i);

我得到错误:没有运算符“=”匹配这些操作数,操作数类型是:Vector = void

我希望编译器能够理解我想要什么:为什么他选择 void 版本而不是另一个返回向量的版本?此外,以我的方式编写更多版本的相同功能是一种好习惯吗?

4

3 回答 3

6

编译器仅根据调用成员函数的对象来选择重载或非重载constconst如果对象(或引用)是const它将选择const重载。

这是好习惯吗?不,从你对编译器应该做什么感到困惑这一事实看来很明显。编写易于阅读和解释而不会混淆的代码通常是一种好习惯:)

于 2013-03-11T17:05:12.363 回答
1

返回类型不参与重载决议。换句话说,您不能拥有仅在返回类型上有所不同的函数。

我认为您的代码只能编译,因为其中一个函数是“const”。

于 2013-03-11T17:01:25.927 回答
1

如果 vector1 不是 const ,它将选择

void Vector::Rotate(const double angle, Vector & axis)

对于成员函数,有一个隐藏参数 this,

Vector Vector::Rotate(const double angle, Vector& axis) const 
//actually is 
Vector Rotate(const Vector const * this,const double angle, Vector& axis) const 

void Vector::Rotate(const double angle, Vector & axis) 
//actually is 
void Rotate(Vector const * this,const double angle, Vector& axis) 

你的对象 vector1 的指针是vector *

我猜编译会选择最匹配的

于 2013-03-11T17:03:12.180 回答