C++:需要帮助理解运算符重载错误
C++: Need help understanding operator-overloading error
我得到了这个代码:
1 #include <iostream>
2 using namespace std;
3
4 class B {
5 private:
6 int n;
7 public:
8 B(int x) : n(x) {}
9 B operator +(B& b) {
10 return B(n+b.n);
11 }
12 friend ostream& operator <<(ostream &out, const B& b) {
13 out << "B: " << b.n;
14 return out;
15 }
16 bool operator <(const B& rhs) const{
17 return n < rhs.n;
18 }
19 };
20
21 B smaller (const B& b1, const B& b2) {
22 if(b1 < b2)
23 return b1;
24 else
25 return b2;
26 }
27
28 int main() {
29 B b1(1), b2(2), b3(3);
30 const B b4 = b1 + (b2 + b3);
31 cout << smaller(b1,b2) << endl;
32 return 0;
33 }
我被要求指出错误(解释它们)并提供修复,在找到两个并修复它们后我得到了上面的代码。
当尝试在 Visual Code 上编译它时,我注意到第 30 行给出了一个错误,但我不明白为什么。
我得到的错误是:
'operator+' 不匹配(操作数类型为 'B' 和 'B')
和
无法将 'B&' 类型的非常量左值引用绑定到 'B'
类型的右值
在 google 上搜索但一无所获后,我尝试了各种方法,包括向第 9 行(运算符 +)中的参数添加一个 const,这解决了问题。
我仍然不明白问题出在哪里,我想得到一个解释。
谢谢。
(b2 + b3)
的结果是临时。也就是说,它是一个 B
类型的对象,作为执行较大表达式的一部分而创建和销毁。
C++ 有一条规则,您不能将非常量引用绑定到临时引用。但这正是您的代码试图做的。因此需要 const.
顺便提一下,您的重载运算符的正确签名是
class B
{
B operator +(const B& b) const {
...
}
};
方法和参数都应该是const。
更好的方法是让 operator+ 成为非成员
B operator +(const B& a, const B& b) {
...
}
一些more reading.
我得到了这个代码:
1 #include <iostream>
2 using namespace std;
3
4 class B {
5 private:
6 int n;
7 public:
8 B(int x) : n(x) {}
9 B operator +(B& b) {
10 return B(n+b.n);
11 }
12 friend ostream& operator <<(ostream &out, const B& b) {
13 out << "B: " << b.n;
14 return out;
15 }
16 bool operator <(const B& rhs) const{
17 return n < rhs.n;
18 }
19 };
20
21 B smaller (const B& b1, const B& b2) {
22 if(b1 < b2)
23 return b1;
24 else
25 return b2;
26 }
27
28 int main() {
29 B b1(1), b2(2), b3(3);
30 const B b4 = b1 + (b2 + b3);
31 cout << smaller(b1,b2) << endl;
32 return 0;
33 }
我被要求指出错误(解释它们)并提供修复,在找到两个并修复它们后我得到了上面的代码。
当尝试在 Visual Code 上编译它时,我注意到第 30 行给出了一个错误,但我不明白为什么。 我得到的错误是:
'operator+' 不匹配(操作数类型为 'B' 和 'B')
和
无法将 'B&' 类型的非常量左值引用绑定到 'B'
类型的右值在 google 上搜索但一无所获后,我尝试了各种方法,包括向第 9 行(运算符 +)中的参数添加一个 const,这解决了问题。 我仍然不明白问题出在哪里,我想得到一个解释。
谢谢。
(b2 + b3)
的结果是临时。也就是说,它是一个 B
类型的对象,作为执行较大表达式的一部分而创建和销毁。
C++ 有一条规则,您不能将非常量引用绑定到临时引用。但这正是您的代码试图做的。因此需要 const.
顺便提一下,您的重载运算符的正确签名是
class B
{
B operator +(const B& b) const {
...
}
};
方法和参数都应该是const。
更好的方法是让 operator+ 成为非成员
B operator +(const B& a, const B& b) {
...
}
一些more reading.