コンパイラが正しい関数のオーバーロードを見つけられない[重複]

Dec 11 2020

関数の3つのオーバーロードを定義する小さな基本クラスがあります。オーバーロードAは純粋な仮想であるオーバーロードBを呼び出し、派生クラスでのその実装はオーバーロードCを呼び出します。

私の完全なコードは次のとおりです。

struct Base {
        int func(int a) {return func(a, a+1);}
        int func(int a, int b, int c) {return a+b+c;}
        virtual int func(int a, int b)=0;
};

struct Derived : public Base {
        int func(int a, int b);
};

int Derived::func(int a, int b) {
        return func(a,b,a+b);
}

int main(int argc, char* argv[]) {
        Derived d;
        d.func(1);
        return 0;
}

このコードはエラーを生成します:

test.cpp: In member function ‘virtual int Derived::func(int, int)’:
test.cpp:12:21: error: no matching function for call to ‘Derived::func(int&, int&, int)’
   12 |  return func(a,b,a+b);
      |                     ^
test.cpp:11:5: note: candidate: ‘virtual int Derived::func(int, int)’
   11 | int Derived::func(int a, int b) {
      |     ^~~~~~~
test.cpp:11:5: note:   candidate expects 2 arguments, 3 provided
test.cpp: In function ‘int main(int, char**)’:
test.cpp:17:10: error: no matching function for call to ‘Derived::func(int)’
   17 |  d.func(1);
      |          ^
test.cpp:11:5: note: candidate: ‘virtual int Derived::func(int, int)’
   11 | int Derived::func(int a, int b) {
      |     ^~~~~~~
test.cpp:11:5: note:   candidate expects 2 arguments, 1 provided

コンパイラが正しいオーバーロードを2回見つけられないのはなぜですか?(派生クラスでオーバーロードCを呼び出すときに1回、メインでオーバーロードAを呼び出すときに1回)

回答

2 super Dec 11 2020 at 12:42

基本クラスと同じ名前の派生クラスで関数を宣言すると、派生クラスでの宣言は基本クラスの関数をシャドウします。

したがって、Derivedでは、表示さfuncれるのは(int, int)1つだけです。

これを解決する簡単な方法の1つは、基本クラス関数をで設定されたオーバーロードにプルすることですusing

struct Derived : public Base {
        using Base::func; // All the func overloads are now pulled into Derived's scope
        int func(int a, int b);
};