2016-07-25 14 views
3
#include <iostream> 
#include <functional> 

class Base 
{ 
    public: 
     virtual ~Base() {} 
     virtual void f1() const {std::cout<<"Base::f1() called"<<std::endl;} 
     virtual void f1(int) const {std::cout<<"Base::f1(int) called"<<std::endl;} 
     virtual void f2() const {std::cout<<"Base::f2() called"<<std::endl;} 
}; 

class Derived : public Base 
{ 
    public: 
     virtual ~Derived() {} 
     void f1() const {std::cout<<"Derived::f1() called"<<std::endl;} 
}; 

int main() 
{ 
    Base base; 
    Derived derived; 
    auto func1 = std::bind(static_cast<void(Base::*)()const>(&Base::f1), std::cref(base)); 
    func1(); 
    auto func2 = std::bind(static_cast<void(Derived::*)()const>(&Derived::f1), std::cref(derived)); 
    func2(); 
    auto func3 = std::bind(&Base::f2, std::cref(base)); 
    func3(); 
    auto func4 = std::bind(&Derived::f2, std::cref(derived)); 
    func4(); 
    auto func5 = std::bind(static_cast<void(Base::*)(int)const>(&Base::f1), std::cref(base), std::placeholders::_1); 
    func5(1); 
    auto func6 = std::bind(static_cast<void(Derived::*)(int)const>(&Derived::f1), std::cref(derived), std::placeholders::_1); // error line 
    func6(2); 
    return 0; 
} 

上記のコードを作成しようとすると、gccは次のエラーメッセージを表示します。私はクラスDerived経由Base::f1(int)を結合することができるとのいずれかの方法がある場合親クラスのオーバーロードされた関数を持つstd :: bind

test.cpp:34:80: error: invalid static_cast from type ‘void (Derived::)() const’ to type ‘void (Derived::)(int) const’

auto func6 = std::bind(static_cast(&Derived::f1), std::cref(derived), std::placeholders::_1);

私は思ったんだけど(ここでは、正常func6をバインド)。 何か助けていただければ幸いです。

+0

'Derived :: f1'を' override'とマークしましたか? – Tas

+0

@Tasあなたは 'override'を書く必要はありません。基本クラスに同じシグネチャを持つ仮想関数があるかどうかを暗黙的にオーバーライドします。 'override'を書いたことを上書きするだけです。 – Rakete1111

+1

'Derived'で' Using Base :: f1; 'を追加すると動作します。可能性のある複製[継承されたクラスで関数のオーバーロードと[C++の問題](http://stackoverflow.com/questions/14212190/c-issue-with-function-overloading-in-an-inherited-class) – neuront

答えて

1

代わりに&Derived::Base::f1を使用してはどうですか?&Derived::f1? Oktalist(感謝)によって示唆されるように、私は

auto func6 = std::bind(static_cast<void(Derived::*)(int)const>(&Derived::Base::f1), std::cref(derived), std::placeholders::_1); 

を意味

、あなたも&Base::f1を使用することができます。

さらに簡単です。

+0

'&Base :: f1'も同様にうまくいくでしょう。 – Oktalist

+0

@Oktalist - そうです。ありがとう。私の答えを変更しました。 – max66

+0

あなたの投稿をありがとう。このソリューションはうまく機能します。しかし、私の懸念は、(このバインディングを行う)ユーザは、このように書くためにクラス階層についての詳細を知る必要があるということです。私は、ユーザーが細部を知ることなく独自のバージョンのメソッドを使用する方が良いと思います。 – qdtang

関連する問題