为什么我需要让这个非友元 == 运算符重载一个成员函数来避免 "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==
,这会增加混淆。
我有以下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==
,这会增加混淆。