Здравствуйте, rg45, Вы писали:
R>Здравствуйте, prog123, Вы писали:
P>>Пример кода: P>>... P>>В vs2013 выдает ошибку: P>>[q]error C2668: 'work<error_code>::async_call' : ambiguous call to overloaded function
R>В 2015-й все в порядке. По видимому глюк msvc-12.
Да, в 2015 нормально, а надо в 2013. Как можно обойти, есть идеи?
Re[3]: ошибка ambiguous call to overloaded function vs2013
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, prog123, Вы писали:
P>>Да, в 2015 нормально, а надо в 2013. Как можно обойти, есть идеи?
R>у меня 2013-й под рукой нет. Что если так:
R>
prog123:
P>Вроде бы callback и a_callback разные типы, но компилятор почему-то считает их одним типом
Из сообщения об ошибке следует совсем другое: две функции async_call никак не конфликтуют между собой, но ни одной из них не может быть отдано предпочтение при передаче такой лямбды. Вполне логичное для реализации C++11 поведение, т.к. в этой версии стандарта конструктор std::function
template<class F> function(F f);
при рассмотрении потенциально возможных пользовательских преобразований одинаково хорошо подходит для чего угодно, и преобразование лямбды к обоим типам callback и a_callback посредством такого конструктора равноценно.
В C++14 тип F проверяется на некоторое соответствие шаблонному аргументу std::function и при несоответствии конструктор исключается из множества кандидатов:
These constructors shall not participate in overload resolution unless f is Callable (20.9.11.2) for argument types ArgTypes... and return type R.
В этом случае преобразование данной лямбды к callback уже не сможет быть найдено и функция
void async_call(callback cb){};
будет исключена при разрешении перегрузки как non-viable.
Re: ошибка ambiguous call to overloaded function vs2013
Может быть, проще избавиться от перегрузки метода по типу сигнатуры? Будут там async_callback(function<void(T)>) и async_callback_ex(function<void(time_t,T)>)?