gpt4 book ai didi

c++ - 在 C++ 中重载 < 运算符的问题

转载 作者:太空狗 更新时间:2023-10-29 19:38:21 25 4
gpt4 key购买 nike

我有一个 Student 对象的 vector ,我想使用 #include <algorithm> 对其进行排序和 sort(list.begin(), list.end());

为了做到这一点,我知道我需要重载“<”运算符,但在尝试(并失败)了网上建议的几种方法后,我的想法已经用完了。

这是我最近的尝试:

在 Student.h 中...

...
using namespace std;
class Student
{
friend bool operator <(const Student& first, const Student& second);
public:
...
private:
...
};

在 Student.cpp 中...

...
#include "Student.h"
using namespace std;
...
bool operator <(const Student& first, const Student& second)
{
return first.Name() < second.Name();
}

其中“Name()”是一个返回字符串的常量函数。

程序编译并运行,但在排序过程中以及当我尝试比较两个 Student 对象(如 s1 < s2)时,我的运算符函数从未被调用。我收到“错误:未找到重载运算符”

我怎样才能正确地重载这个运算符,以便我的排序按我的预期工作?

最佳答案

你没有说你使用的是哪个编译器,但我怀疑你使用的是一个相当新的编译器,它实现了“ friend 不是声明”规则。类中的 friend 语句不作为函数声明;其他包含 Student.h 的模块看不到该函数的任何声明。它仅在 Student.cpp 文件中可见。 (较旧的编译器没有此规则,并将友元声明视为函数声明。)

该函数不需要是友元,因为它不使用 Student 类的任何私有(private)成员(我假设 Name() 是公共(public)的)。将函数声明移到类外部,并将“friend”替换为“extern”,它应该可以工作。

正如上面的一些海报所建议的那样,可以使运算符成为成员函数,但这不是必需的。让比较运算符成为成员函数通常是不受欢迎的,因为这意味着两个参数没有被对称对待(一个是不可见的“this”参数,另一个是普通函数参数),这在某些情况下会导致令人惊讶的结果(例如,可以对参数应用不同的类型转换)。

关于c++ - 在 C++ 中重载 < 运算符的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com