だから、ここに私の質問を説明するいくつかの基本的なコードがあります:
#include <functional>
int func(int x) {
return x;
}
int func(int x, int y) {
return x + y;
}
int main() {
std::ptr_fun<int, int>(func);
}
パラメータの数が異なる関数には、2つのオーバーロードがあります。次に、ファンクターで単一パラメーターのバージョンを変更しようとします。もちろん、次のエラーが発生します。
test.cc:関数内'int main()': test.cc:13:29:エラー:オーバーロードされた'ptr_fun()'の呼び出しがあいまいです /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4/bits/stl_function.h:437:5:注:候補は次のとおりです:std :: pointer_to_unary_function std :: ptr_fun(_Result (*)(_ Arg))[with _Arg = int、_Result = int] /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4/bits/stl_function.h:463:5:注:std :: pointer_to_binary_function std :: ptr_fun(_Result(*) (_Arg1、_Arg2))[with _Arg1 = int、_Arg2 = int、_Result = int]
func
キャストしてそれで終わらせることができるのは知っていますが、なぜこれが曖昧なのか考えさせられました。どちらのバージョンにstd::ptr_fun
もテンプレート定義にデフォルトのパラメーターがありません。2つのテンプレートパラメーターはであると明示的に述べましたint
。
実際、次のように、テンプレートのインスタンス化時にコンパイラが基本的に実行していることを実行すると、次のようになります。
#include <functional>
int func(int x) {
return x;
}
int func(int x, int y) {
return x + y;
}
std::pointer_to_unary_function<int,int> my_ptr_fun (int (*f)(int)) {
return std::pointer_to_unary_function<int,int>(f);
}
int main() {
my_ptr_fun(func);
}
それはうまくコンパイルされます、どういうわけか曖昧さはなくなりました!なぜこれが当てはまるのか、誰かがインサイトを持っていますか?