Std::function не может распознать перегруженные функцииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::function не может распознать перегруженные функции

Сообщение Anonymous »

Я пытаюсь понять, почему std::function не может различать перегруженные функции.
#include

void add(int,int){}

class A {};

void add (A, A){}

int main(){
std::function func = add;
}

В приведенном выше коде function может соответствовать только одной из этих функций, но она завершается неудачей. Почему это так? Я знаю, что могу обойти это, используя лямбда или указатель функции на фактическую функцию, а затем сохранив указатель функции в функции. Но почему это терпит неудачу? Разве не ясно из контекста, какую функцию я хочу выбрать? Пожалуйста, помогите мне понять, почему это не удается, поскольку я не могу понять, почему в этом случае происходит сбой сопоставления шаблонов.
Ошибки компилятора, которые я получаю в clang, следующие:
test.cpp:10:33: error: no viable conversion from '' to
'std::function'
std::function func = add;
^ ~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03:1266:31: note:
candidate constructor not viable: no overload of 'add' matching
'std::__1::nullptr_t' for 1st argument
_LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03:1267:5: note:
candidate constructor not viable: no overload of 'add' matching 'const
std::__1::function &' for 1st argument
function(const function&);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_03:1269:7: note:
candidate template ignored: couldn't infer template argument '_Fp'
function(_Fp,
^
1 error generated.


Подробнее здесь: https://stackoverflow.com/questions/303 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»