2017-08-08 5 views
0

は、次の例を考えてみてください過負荷に基底クラスの型パラメータ法を見つけることができません。C++テンプレート:

#include <iostream> 

class Base { 
public: 
    virtual void foo(std::string str) = 0; 
    void foo() { foo("LOL"); } 
}; 

class Derived : public Base { 
public: 
    void foo(std::string str) { std::cout << str << std::endl; } 
}; 

template<class T> class MyTemplate { 
public: 
    void print() { a.foo(); } 
    T a; 
}; 

int 
main(int argc, char** argv) 
{ 
    MyTemplate<Derived> a; 
    a.print(); 
} 

コンパイルすると、私は次のようなエラーがあります:それは解決策があることがわかっ

main.cpp: In instantiation of ‘void MyTemplate<T>::print() [with T = Derived]’: 
main.cpp:24:11: required from here 
main.cpp:16:18: error: no matching function for call to ‘Derived::foo()’ 
    void print() { a.foo(); } 
       ^
main.cpp:16:18: note: candidate is: 
main.cpp:11:8: note: virtual void Derived::foo(std::string) 
    void foo(std::string str) { std::cout << str << std::endl; } 
     ^
main.cpp:11:8: note: candidate expects 1 argument, 0 provided 

を書く:

void print() { a.Base::foo(); } 

なぜですか? G ++がそれ自身のBase :: foo()メソッドを見つけられないのはなぜですか?

おかげ

+0

'a.foo()'は引数をとりませんが、 'Derived clas '関数' foo() 'は' string'を引数として取ります。 –

+0

@Klaus私はそういうわけではないと思います... –

+0

@EdgarRokyan:Yepp、あなたは正しいです。コメントと投票を削除しました...ありがとう – Klaus

答えて

1

理由は、クラスDerivedのメソッドfooがクラスBaseから継承されているのと同じ名前を持つすべてのメソッドを隠していることです。したがって、std::stringをパラメータとして受け入れるメソッドfooの1つのバージョンのみが、Derivedを通じて通話に使用できます。これにより

class Derived : public Base { 
public: 
    using Base::foo; 
    void foo(std::string str) { std::cout << str << std::endl; } 
}; 

Derivedクラスに見えるfooを継承作るためにあなたもusing declarationを使用することができ、

a.Base::foo(); 

注:結果は、明示的な構文を使用して引数を受け付けないどのfooを呼び出す必要があります次のコードを変更すると有効になります:

a.foo();