链接运算符时,运算符重载失败吗?

时间:2018-11-13 20:37:32

标签: c++ operator-overloading

我用以下重载运算符创建了一个自定义可变长度向量类Vec

float& operator[](int i);
Vec& operator+=(Vec& rhs);
Vec operator+(Vec& rhs);
Vec& operator-=(Vec& rhs);
Vec operator-(Vec& rhs);
Vec& operator*=(float rhs);
Vec operator*(float rhs);
Vec& operator/=(float rhs);
Vec operator/(float rhs);

这些重载可以很好地工作,并且我可以得到正确的结果,但是当我尝试链接它们时,会出现template argument deduction/substitution failed的编译错误。有谁知道为什么吗?

这有效:

Vec multiplier = d * time;
Vec collision = e + multiplier;

此操作失败: Vec collision = e + (d * time);

e和d的类型为Vec,时间的类型为float

1 个答案:

答案 0 :(得分:0)

问题是您已声明函数使用Vec &rhs参数而不是const Vec &rhs。缺少const意味着您只能将引用传递给真实的(命名的)对象。您不能传递对未命名临时对象的引用。

当您“链接”操作时,内部操作的结果将是一个未命名的临时操作,然后该临时操作将无法传递给外部操作,因此您会遇到重载解析失败(这表示为模板替换失败,因为类显然实际上是模板)