将重载运算符分派到 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) { }
};
如果我对 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) { }
};