C++ Comparision运算符重载

jogvjijk  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(126)

重载operator〈(例如)在类内部或外部有什么区别?
为什么std map使用外部实现?但我的比较用的是内部的?
如何知道需要使用哪个实现?
代码底部是代码测试它,我用。

class Foo
{
public:
    Foo() {}
    Foo(int val) : a(val) {}
    int getA() const { return a; }
    void setA(const int& val) { a = val; }

    inline bool operator<(const Foo& f)
    {
        cout<<"operator< inside\n";
        return a < f.getA();
    } 
    
private:
    int a = 1;
};

inline bool operator<(const Foo& f1, const Foo& f2)
{
    cout<<"operator< outside\n";
    return f1.getA() < f2.getA();
}

std::map<Foo, const char*> fMap = { {Foo(2), "Val 2"}, {Foo(3), "Val 3"} };

int main()
{
    cout<<"Hello World\n";
    
    Foo f, f2;
    f.setA(3);
    f2.setA(7);
    
    cout << (f < f2) << "\n";

    return 0;
}
Output:
operator< outside
operator< outside
Hello World
operator<
inside 1
qni6mghb

qni6mghb1#

std::map中,键是constFoo::operator<不是const限定的,所以不能在const对象上调用它。这就是不使用它而使用全局运算符的原因。要解决此问题,只需将operator <更改为

inline bool operator<(const Foo& f) const
{
    cout<<"operator< inside\n";
    return a < f.getA();
}

相关问题