MyTinySTL icon indicating copy to clipboard operation
MyTinySTL copied to clipboard

关于set 和map的比较操作符重载问题

Open senvenseaNana7mi opened this issue 2 years ago • 5 comments

friend bool operator==(const set& lhs, const set& rhs) { return lhs.tree_ == rhs.tree_; } friend bool operator< (const set& lhs, const set& rhs) { return lhs.tree_ < rhs.tree_; } set.h第199行和200行 已经在类内定义了比较操作符,在类外又定义了一次,这样不会出现重定义的问题吗

senvenseaNana7mi avatar Oct 03 '22 08:10 senvenseaNana7mi

friend 的原型在类中出现,但是貌似友元函数不是成员函数吧,应该不会出现重定义的问题。

Evilrabbit520 avatar Oct 16 '22 17:10 Evilrabbit520

不会重定义。类内的是非模板函数,它与函数模板不对应。

但这个设计会导致类外的 operator==operator< 函数模板不被选择,使用 ==< 时选择的是非模板函数。

frederick-vs-ja avatar Dec 01 '22 06:12 frederick-vs-ja

我想我们可以把 MyTinySTL 的所有比较运算符改成友元。虽然这和标准库不一致,但可能更好。 另外在 C++20 模式下不再需要单独的关系运算符或 operator!= ,仅提供 operator==operator<=> 即可。

frederick-vs-ja avatar Dec 01 '22 06:12 frederick-vs-ja

我想我们可以把 MyTinySTL 的所有比较运算符改成友元。虽然这和标准库不一致,但可能更好。 另外在 C++20 模式下不再需要单独的关系运算符或 ,仅提供 和 即可。operator!=``operator==``operator<=>

谢谢解答!对类模板的友元了解的不是很透彻,请教一下大佬这里的friend bool operator==(const set& lhs, const set& rhs)set不加模板参数是因为是在类模板内声明并定义的吗。

senvenseaNana7mi avatar Dec 01 '22 09:12 senvenseaNana7mi

我想我们可以把 MyTinySTL 的所有比较运算符改成友元。虽然这和标准库不一致,但可能更好。 另外在 C++20 模式下不再需要单独的关系运算符或 ,仅提供 和 即可。 operator!=operator==operator<=>

谢谢解答!对类模板的友元了解的不是很透彻,请教一下大佬这里的friend bool operator==(const set& lhs, const set& rhs)set不加模板参数是因为是在类模板内声明并定义的吗。

是的,此处的 set注入类名injected-class-name),可以自动指代类模板的当前特化。

frederick-vs-ja avatar Dec 01 '22 12:12 frederick-vs-ja