ページ 11

[C++]クラスのメンバ関数を別のクラスへ渡す

Posted: 2020年6月23日(火) 00:08
by ジョセフソン接合
表題の通り、以下のようにFuncTest2内のメンバ関数f及びgをFuncTestへ
渡したいのですが、FuncTest2::bのみがうまく渡せて、他が渡せない理由がわかりません。
FuncTest2::bも暗黙的に型変換されているはずなので、"うまく"というのもおかしな話ですが。
ご教授願います。

コード:

#include <functional>
class FuncTest {
public:
	std::function<void(void)> _f;
	FuncTest(std::function<void(void)>& f) :_f(f){}
};
class FuncTest2 {
	std::function<void(void)> f = []() {std::cout << "f" << std::endl; };
	void g(void) { std::cout << "g" << std::endl; }
	FuncTest a(FuncTest2::f); //NG
	FuncTest b = FuncTest2::f; //OK
	FuncTest c(FuncTest2::g); //NG
	FuncTest d = FuncTest2::g; //NG
};
[\code]

Re: [C++]クラスのメンバ関数を別のクラスへ渡す

Posted: 2020年6月23日(火) 18:30
by usao
bはFuncTestのコンストラクタが要求している型と合致しているfを指定しているからOK.

aは,多分,メソッドの宣言だと解釈されている.()ではなく{}を使えば通るかと.

c,dに関しては,gがメンバ関数なのだから呼び出すにはインスタンスが必要なわけで,その書き方のままじゃ無理なのは当たり前.
(ちなみにgをstaticにしても,FuncTestのコンストラクタが要求する型に暗黙的に変換はしてくれない,と思う.そこまで深く何段階も暗黙の型変換は行われないハズ.)

ってことかと.

Re: [C++]クラスのメンバ関数を別のクラスへ渡す

Posted: 2020年6月23日(火) 18:32
by usao
ちなみに,a,bのところの FuncTest2:: は無意味.

Re: [C++]クラスのメンバ関数を別のクラスへ渡す

Posted: 2020年6月23日(火) 22:17
by ジョセフソン接合
aは,多分,メソッドの宣言だと解釈されている.()ではなく{}を使えば通るかと.
まさにそのとおりでした。
エラーに型の名前ではありませんと表示されており、この意味がようやく理解できました。
波括弧の初期化というものがあったのですね。
ありがとうございます。
ちなみに,a,bのところの FuncTest2:: は無意味.
ありがとうございます。
上記コードのようなことをしているサイトを参考にしたとき書いてあったので
bでFuncTest2::無しで通っているのを確認してはいたのですが取り敢えずで書いていました。

勉強になりました。ありがとうございます。