- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テンプレート引数の型推測)
C++で関数ポインタと関数オブジェクトを同じように利用する方法
このQ&Aのポイント
- C++で関数ポインタと関数オブジェクトを同じように利用したい場合、基底クラスとテンプレートクラスを使用する方法があります。
- 基底クラスに仮想関数を作成し、テンプレートクラスで継承したクラスを作成します。コンストラクタで関数ポインタまたは関数オブジェクトを受け取り、仮想関数内で呼び出します。
- この方法では、クラスをテンプレートにする必要がありますが、引数から型を推測してインスタンスを作成できます。しかし、関数オブジェクトのコンストラクタに引数が設定されている場合、デフォルト引数を与えない限り正常に動作しないことに注意が必要です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
蛇足っぽいけどちょっと補足: 「衝突」ってのは日本語として変でしたね. C++ の規格では 定義とも宣言とも取れるものはすべて宣言と解釈する となっていて, 今の場合この仕様が適用されています. 実際, メッセージでも 「プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?)」 と書いてありますよね. これは, 「ひょっとすると変数を定義しようとしているのかもしれないけど, (C++ の規格に従って) 関数のプロトタイプ宣言と解釈しましたよ」ってことも意味します. Hoge hoge(Function()); のどこが「関数の宣言」なのかと疑問に思うかもしれませんが, これは実は Hoge hoge(Function (*foo)()); と同じ意味になります. 関数の引数においては「関数」と「関数へのポインタ」が同一視されること, また「引数の名前は書かなくていい」ことに注意してください. どう見ても宣言ととれない場合, たとえば Hoge hoge(Function(1)); や Hoge hoge(function); では「変数の定義」と解釈されています. ということで, Hoge hoge = Hoge(Function()); のように定義することになります.
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
テンプレートは関係ありません. ・コンストラクタに Function() を渡す Hoge型の変数 hoge の定義 と ・「引数をとらないで Function を返す関数 (へのポインタ)」を引数として Hoge を返す関数 hoge の宣言 が衝突しているため後者をとっています. C++ の規格を確認してください.
お礼
>定義とも宣言とも取れるものはすべて宣言と解釈する なるほどそういうことですか。素早く的確な解答ありがとうございました。 大変わかりやすかったです。 Hoge hoge = Hoge(Function()); と書くことで、期待通りの動作をしました。 ただこちらはコピーコンストラクタが呼ばれるようで、 コピー禁止している場合にはできないようですね。