运算符重载:从成员函数调用友元函数
Operator overloading: calling friend function from member function
我有一个学生class。我想重载 +
运算符,以便我可以向 class 添加一个双精度变量。这里是 Student
class:
class Student {
private:
std::string firstName;
double grade;
public:
Student(const std::string &firstName, double grade);
double getGrade() const;
friend Student operator+(double grade, const Student &student);
Student operator+(double grade) const;
};
和实现:
Student::Student(const std::string &firstName, double grade) {
this->firstName = firstName;
this->grade = grade;
}
double Student::getGrade() const {
return grade;
}
Student operator+(double grade, const Student &student) {
return Student(student.firstName, student.grade + grade);
}
Student Student::operator+(double grade) const {
return operator+(grade, *this);
}
double + Student
通过友元函数完成,Student + double
通过成员函数完成。当我编译时,我得到这个:
error: no matching function for call to ‘Student::operator+(double&, const Student&) const’
return operator+(grade, *this);
^
note: candidate is:
note: Student Student::operator+(double) const
Student Student::operator+(double grade) const {
^
note: candidate expects 1 argument, 2 provided
为什么我不能从成员函数调用友元函数?
[更新]
然而,当我重载 <<
运算符时,我可以从成员函数中调用它而无需预先挂起 ::
.
friend std::ostream &operator<<(std::ostream &os, const Student &student);
和实施:
std::ostream &operator<<(std::ostream &os, const Student &student) {
os << student.grade;
return os;
}
您正在尝试调用成员函数,而不是友元函数(参见 C++11 7.3.1.2/3)。你应该写
Student Student::operator+(double grade) const {
return ::operator+(grade, *this);
}
使用 ::
确保从您当前所在的全局命名空间发生重载解析。
另一种方法(在我看来可读性较差)是将友元函数添加到重载决议集中
Student Student::operator+(double grade) const {
using ::operator+;
return operator+(grade, *this);
}
或者,按照 Jarod 的建议,更具可读性,
Student Student::operator+(double grade) const {
return grade + *this;
}
编辑:对于 "why":[class.friend]/p7 和 [basic.lookup.argdep]/p3 解释重载解析时同名成员函数“hides”的友元函数名称。
我有一个学生class。我想重载 +
运算符,以便我可以向 class 添加一个双精度变量。这里是 Student
class:
class Student {
private:
std::string firstName;
double grade;
public:
Student(const std::string &firstName, double grade);
double getGrade() const;
friend Student operator+(double grade, const Student &student);
Student operator+(double grade) const;
};
和实现:
Student::Student(const std::string &firstName, double grade) {
this->firstName = firstName;
this->grade = grade;
}
double Student::getGrade() const {
return grade;
}
Student operator+(double grade, const Student &student) {
return Student(student.firstName, student.grade + grade);
}
Student Student::operator+(double grade) const {
return operator+(grade, *this);
}
double + Student
通过友元函数完成,Student + double
通过成员函数完成。当我编译时,我得到这个:
error: no matching function for call to ‘Student::operator+(double&, const Student&) const’
return operator+(grade, *this);
^
note: candidate is:
note: Student Student::operator+(double) const
Student Student::operator+(double grade) const {
^
note: candidate expects 1 argument, 2 provided
为什么我不能从成员函数调用友元函数?
[更新]
然而,当我重载 <<
运算符时,我可以从成员函数中调用它而无需预先挂起 ::
.
friend std::ostream &operator<<(std::ostream &os, const Student &student);
和实施:
std::ostream &operator<<(std::ostream &os, const Student &student) {
os << student.grade;
return os;
}
您正在尝试调用成员函数,而不是友元函数(参见 C++11 7.3.1.2/3)。你应该写
Student Student::operator+(double grade) const {
return ::operator+(grade, *this);
}
使用 ::
确保从您当前所在的全局命名空间发生重载解析。
另一种方法(在我看来可读性较差)是将友元函数添加到重载决议集中
Student Student::operator+(double grade) const {
using ::operator+;
return operator+(grade, *this);
}
或者,按照 Jarod 的建议,更具可读性,
Student Student::operator+(double grade) const {
return grade + *this;
}
编辑:对于 "why":[class.friend]/p7 和 [basic.lookup.argdep]/p3 解释重载解析时同名成员函数“hides”的友元函数名称。