将重载运算符分派到 C++ 中的基础问题

Issue dispatching an overloaded operator to base in C++

如果我对 C++ 中的调度有根本性的误解,请原谅我!

下面粘贴的代码按预期工作。

但是,如果我 uncomment/add Derived 中的附加运算符<< 方法(应该处理不同的 agrument 类型),C++ 将无法解析之前工作的调度“*this << something” (在没有该方法的情况下,它会按预期成功发送到 Base)。

它说:

main.cpp:25:15: Invalid operands to binary expression ('Derived' and 'Something')

有人可以向我解释为什么会这样吗?

提前致谢

(Mac OS 蒙特雷 12.2.1, xCode 13.2.1)

#include <iostream>

class Something { };
class SomethingUnrelated { };

class Base {
public:
    virtual void method() = 0;
    void operator<<(Something something) {
        method();
    }
};

class Derived : public Base {
public:
    void method() { std::cout << "Derived::method() - Yay!" << std::endl; }
    void work(Something something) {
        *this << something;
    }
    // void operator<<(SomethingUnrelated somethingUnrelated) { }
};

int main(int argc, const char * argv[]) {
    Something something;
    Derived derived;
    derived.work(something);
    return 0;
}

父 class 中的名称在为 unqualified name lookup 构建查找集时被隐藏。您可以将父操作符带到由 using 指令设置的子查找中。我找不到重复的问题,但我很确定重复的问题存在。

class Derived : public Base {
public:
    void method() { std::cout << "Derived::method() - Yay!" << std::endl; }
    void work(Something something) {
        *this << something;
    }
    using Base::operator<<;
    void operator<<(SomethingUnrelated somethingUnrelated) { }
};