c++ - 编译器如何选择正确的函数?

标签 c++ compiler-construction overloading

我写了一个小型 3d vector 类。特别是我写了两个函数,一个用于旋转 vector ,另一个用于返回 vector 本身的旋转拷贝。所以我有以下内容:

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 版本而不是另一个返回 vector 的版本?此外,按照我的方式编写相同函数的更多版本是一种好习惯吗?

最佳答案

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

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

关于c++ - 编译器如何选择正确的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344270/

相关文章:

c++ - 何时重载按引用传递(左值和右值)优于按值传递?

android - cocos2dx- 3.7 和 3.7.1 cocos studio 不工作

c++ - 如何更新 code::blocks 以使用 TDM-GCC?

scala - 当类型已知时,为什么对重载定义的引用不明确?

c - Microsoft C 编译器 .EC 和 .C 源文件

java - 为什么这不会重载?

c++ - 使用 C++ rand() 获取随机方向(上/下/左/右)——总是起床

c++ - Visual C++ 创建动态数据断点

java - 使用 -source 和 -target javac 选项编译

Java:重载方法解析