为什么我需要让这个非友元 == 运算符重载一个成员函数来避免 "undefined reference" 错误?

Why do I need to make this non friend == operator overload a member function to avoid "undefined reference" errors?

我有以下class,它是这样定义的:

namespace ns{
class Bit{
public:
    explicit Bit(bool bit);
    Bit() = default;
    explicit operator bool () const;
    [[nodiscard]]
    bool value() const;
    [[nodiscard]]
    Bit operator==(const Bit& rhs) const;
    //friend Bit operator==(const Bit &lhs, const Bit &rhs); also doesn't work
private:
    bool m_bit;
};
//doesn't work
//[[nodiscard]]
//Bit operator==(const Bit &lhs, const Bit &rhs);
}

当我将运算符 == 重载定义为独立函数时,它不起作用,我得到

undefined reference to `ns::operator==(ns::Bit const&, ns::Bit const&)'

好友功能版本类似。

standalone函数的定义在.cpp文件中如下:

ns::Bit operator==(const ns::Bit &lhs, const ns::Bit &rhs) {
    return ns::Bit(lhs.value() == rhs.value());
}

成员函数的定义,有效,如下

ns::Bit ns::Bit::operator==(const ns::Bit &rhs) const{
    return Bit(value() == rhs.value());
}

为什么要强制我创建一个成员函数?

ns::Bit ns::operator==(const ns::Bit &lhs, const ns::Bit &rhs) {
  return ns::Bit(lhs.value() == rhs.value());
}

您制作了原型 ns::operator== 然后定义了 ::operator==

通过 ADL 仅找到 ns::operator==。根据其他 == 运算符和您所在的名称空间,也可能会找到 ::operator==,这会增加混淆。