与“运算符-”不匹配
no match for ‘operator-’
自从
我更改编译器以来已经有一段时间了,但是当我这样做时,我以前运行良好的代码无法再编译 - 我将其归因于最近C++语言标准的细微变化(没有太密切地遵循它们)。
还行。曾经工作的代码是:
VECTOR operator-(const VECTOR& v){
VECTOR tmp;
tmp.x = x - v.x;
tmp.y = y - v.y;
tmp.z = z - v.z;
return tmp;
}
这里,x,y,z都是VECTOR类的公共成员。
该类用作:
VECTOR diff, A, B;
diff = A - B;
使用 g++6.2.0 编译它时,出现错误:
error: no match for ‘operator-’ (operand types are ‘const VECTOR’ and ‘const VECTOR’)
我遵循了在线找到的各种示例(包括此处),并通过 friend 函数实现了运算符重载:
friend VECTOR operator-(VECTOR lhs, const VECTOR& rhs){
lhs.x -= rhs.x;
lhs.y -= rhs.y;
lhs.z -= rhs.z;
return lhs;
}
这段代码编译得很好。我看到了使用朋友函数的基本原理,但我想知道为什么旧的(成员函数)实现不起作用以及如何对其进行编译。
提前感谢!
成员当然应该const
合格,如
VECTOR operator-(const VECTOR& v) const {
-----
该问题不会影响您的特定示例,但当您减去 const VECTOR
时,它可能会导致某处出现问题。
此外,friend
签名有点不稳定。几年前有一段短暂的时期,人们普遍建议按价值传递LHS并将其返回。但是,复制 elision 不适用于参数对象,就像它不适用于局部变量一样。复制 elision 对于这样的运算符非常重要,因为它减少了程序需要初始化的对象数量。因此,您可以尝试这样做以提高性能:
friend VECTOR operator-(const VECTOR& lhs, const VECTOR& rhs){
VECTOR tmp;
tmp.x = lhs.x - rhs.x;
tmp.y = lhs.y - rhs.y;
tmp.z = lhs.z - rhs.z;
return tmp;
}
问题是成员函数需要是常量
VECTOR operator-(const VECTOR& v) const {
^^^^^
否则,运算符不能应用于左侧const
参数。
相关文章:
- 在使用累加时,C++中的运算符+不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- 映射迭代器与运算符不匹配
- 与"运算符>>"不匹配(操作数类型为"QDataStream"和"QJsonObject")
- 与标准中的"运算符<<"不匹配
- 运算符不匹配*=
- 不断收到错误" 与"运算符>>不匹配";
- 编译我的 3 个文件时,我收到错误,说"运算符="不匹配
- C++ 模板与运算符<不匹配
- 与"运算符="不匹配
- 代码块编译错误与运算符<<不匹配
- 错误:运算符 [] 不匹配。在比较列表中的 int 和 int 时<int>,
- 解决错误:运算符 [] 不匹配
- 错误:与"运算符>>"不匹配(操作数类型为"std::istream
- 与"运算符[]"不匹配(操作数类型为"std::unique_ptr<std::vector<int> >"和"int")
- 错误:与“运算符 []”不匹配
- 与"运算符<<不匹配
- 错误:与"运算符[]"不匹配(操作数类型为"QVector<int>"和"QCharRef")
- 错误:"运算符>>"不匹配 重载 istream 运算符