이것은 기본 클래스 함수가 과부하 해결에 포함되지 않았기 때문입니다. 비슷한 상황은 내부 범위에서 선언 된 함수와 비슷합니다. 외부 범위에서 선언 된 함수에 과부하가 걸리지 않습니다 (아래 예 참조). 파생 클래스 범위가 기본 클래스 범위 안에 중첩되어 있다고 상상할 수 있습니다.
컴파일러가 D::insert
후보를 찾으면 기본 클래스를 더 이상 볼 수 없습니다. D::insert
이 없으면 컴파일러는 insert
메서드 호출을위한 기본 클래스를 조사합니다. 당신과 기본 클래스에서 insert
함수 이름을 도입하여이 문제를 해결할 수 있습니다
using B::insert;
이 파생 클래스의 모든 B::insert
오버로드 기능을 소개합니다. 다른 상황에서 같은 방법으로 어떻게 과부하 작품
d.B::insert(1)
샘플 코드 : 또는 당신이 말한대로, 당신은 명시 적으로 기본 클래스 메서드를 호출 할 수 있습니다
namespace Outer {
void foo(double d) {
std::cout << "Outer::foo(double d)\n";
}
namespace Inner {
//using Outer::foo; // uncomment to see "Outer::foo(double d)" in output
void foo(int n) {
std::cout << "Inner::foo(int n)\n";
}
void callMe() {
foo(1.1);
}
}
}
int main() {
Outer::Inner::callMe(); // Outputes: Inner::foo(int n)
}
나 :
void foo(std::string s) {
std::cout << "foo(std::string s)\n";
}
void foo(double d) {
std::cout << "foo(double d)\n";
}
void foo(int n) {
std::cout << "foo(int n)\n";
}
int main() {
void foo(int d); // comment out to see foo(double d) in output
foo(1.1); // outputs: "foo(int n)", foo(double d) is hidden
//foo("hello"); // ups, it wont compile - name lookup in c++ happens before type checking
// commenting out `void foo(int d);` above will fix this.
}
https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule 참조 – Oktalist