8

だから、ここに私の質問を説明するいくつかの基本的なコードがあります:

#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);
}    

それはうまくコンパイルされます、どういうわけか曖昧さはなくなりました!なぜこれが当てはまるのか、誰かがインサイトを持っていますか?

4

1 に答える 1

4

これは、テンプレート化された関数を呼び出すときに、関数の引数の型から推測できるテンプレートパラメーターを指定する必要がないためです。その結果、呼び出しstd::ptr_fun<int, int>は実際にどのstd::ptr_funオーバーロードを呼び出すかを指定せず、解決のための引数として渡す関数に依存します。func両方のオーバーロードに適合するオーバーロードがあるため、std::ptr_funあいまいさがあります。

編集:これは私のポイントを示す例です-Ideoneで実行され、両方の関数呼び出しが同じ型を返すことを示しています。

#include <functional>
#include <iostream>
#include <typeinfo>

double func(int x) 
{
    return x;
}

int main() 
{
    std::cout << typeid(std::ptr_fun<int>(func)).name() << std::endl;
    std::cout << typeid(std::ptr_fun<int, double>(func)).name() << std::endl;
}
于 2011-07-11T20:59:16.023 に答える