#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
をバインド)。 何か助けていただければ幸いです。
'Derived :: f1'を' override'とマークしましたか? – Tas
@Tasあなたは 'override'を書く必要はありません。基本クラスに同じシグネチャを持つ仮想関数があるかどうかを暗黙的にオーバーライドします。 'override'を書いたことを上書きするだけです。 – Rakete1111
'Derived'で' Using Base :: f1; 'を追加すると動作します。可能性のある複製[継承されたクラスで関数のオーバーロードと[C++の問題](http://stackoverflow.com/questions/14212190/c-issue-with-function-overloading-in-an-inherited-class) – neuront