Итак, вот базовый код, который иллюстрирует мой вопрос:
#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: In function 'int main()': test.cc:13:29: error: call of overloaded 'ptr_fun()' is ambiguous /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4/bits/stl_function.h:437:5: note: candidates are: 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: note: std::pointer_to_binary_function std::ptr_fun(_Result (*)(_Arg1, _Arg2)) [with _Arg1 = int, _Arg2 = int, _Result = int]
Я знаю, что могу просто привести func
и покончить с этим , но это заставило меня задуматься , почему это неоднозначно ]? Ни одна из версий std :: ptr_fun
не имеет параметров по умолчанию в определениях шаблонов, и я прямо сказал, что двумя параметрами шаблона являются 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);
}
Компилируется отлично, как-то двусмысленность исчезла! Кто-нибудь знает, почему это так?