2017-12-09 7 views
1
class A 
{ 
public: 
    A() {} 

    void print(std::function<void(int)> func); 

    virtual ~A() {} 
}; 

void A::print(std::function<void(int)> func) 
{ 
    func(); 
} 

void printInt(int a) 
{ 
    std::cout << a << std::endl; 
} 

int main() 
{ 
    A a; 

    a.print(std::bind(&printInt, 3)); 

    return 0; 
} 

私はこのコードサンプルを持っているとしましょう。 voidメソッドprintInt(int a)をA :: print(std :: function func)に渡し、渡された関数を呼び出す方法は?私は「候補者は1つの引数、0が提供されると期待しています」と私はそれに対処する方法を知らない。std :: functionとstd :: bindを使用して、パラメータを含むvoidメソッドを別のメソッドに渡すC++

編集: 私はそれを言及すべきでしたが、私の目標はその整数を渡すことですが、実際には私はどのように考えていません。私はこのような何かしようとすると:

void A::print(std::function<void(int a)> func) 
{ 
func(a); 
} 

を私は「エラー: 『』このスコープで宣言されていません」を取得します。

+0

引数なしで 'int'をとる関数を呼び出しています(' func() ')。 – 0x499602D2

答えて

3

funcに引数を渡すつもりがない場合は、std::function<void(void)>にする必要があります。 void(int)の署名は、それを整数にするつもりであることを意味します。です。そしてあなたのコードは明らかに必要な議論を提供していません。あなたはfuncに引数を渡すために意図を行う場合


は、それはそうのように、A::printのパラメータである必要があります:

void A::print(std::function<void(int)> func, int a) { 
    func(a); 
} 

あなたの試みは、関数のパラメータは議論の余地があるaという名前が付けられ、指定しました。参照するA::printにはaが存在しないためです。 )

a.print(&printInt, 3); 
+0

@imaco - コメントのコードはご記入ください。これはフォーラムではありません。質問自体にあなたの意図を掲載してください。 – StoryTeller

+0

次に、std :: bind()を使用しないで、代わりにstd :: ptr_funを使用します。 – SoronelHaetir

+0

@StoryTeller私の悪い先生 – imaco

0

あなたのバインド(引数を取らないが、::印刷が1をとる関数を期待それはそれは取るかのようにその関数を呼び出してしようとする関数を作成します:上記はまた、あなたがbindで済ますことができることを意味します引数はありません。

答えは、A :: printを引数を取らないstd ::関数に変更することです。

関連する問題