ошибка ambiguous call to overloaded function vs2013
От: prog123 Европа  
Дата: 17.05.17 10:14
Оценка:
Пример кода:
#include <functional>
#include <cstdint>

class error_code
{
};

template <typename result_type>
class work
{
public:
       using callback = std::function <void(result_type)>;
       using a_callback = std::function <void(int64_t duration_ms, result_type ec)>;
 
       void async_call(a_callback cb){};
       void async_call(callback cb){};
};

int main(int, char**)
{
       std::function <void(error_code)> cb;

       work<error_code> w;
       w.async_call([cb](int64_t duration, error_code ec)
       {
       });

       return 0;
}


В vs2013 выдает ошибку:

error C2668: 'work<error_code>::async_call' : ambiguous call to overloaded function

could be 'void work<error_code>::async_call(std::function<void (error_code)>)'

or 'void work<error_code>::async_call(std::function<void (int64_t,result_type)>)'

with

[

result_type=error_code

]
while trying to match the argument list '(main::<lambda_7d2398af0e7f9b7dcb8924b86226e87d>)'


Вроде бы callback и a_callback разные типы, но компилятор почему-то считает их одним типом
Re: ошибка ambiguous call to overloaded function vs2013
От: rg45 СССР  
Дата: 17.05.17 10:47
Оценка:
Здравствуйте, prog123, Вы писали:

P>Пример кода:

P>...
P>В vs2013 выдает ошибку:
P>[q]error C2668: 'work<error_code>::async_call' : ambiguous call to overloaded function

В 2015-й все в порядке. По видимому глюк msvc-12.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: ошибка ambiguous call to overloaded function vs2013
От: prog123 Европа  
Дата: 17.05.17 10:50
Оценка:
Здравствуйте, 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 СССР  
Дата: 17.05.17 10:56
Оценка: 3 (1)
Здравствуйте, prog123, Вы писали:

P>Да, в 2015 нормально, а надо в 2013. Как можно обойти, есть идеи?


у меня 2013-й под рукой нет. Что если так:

int main(int, char**)
{
   std::function <void(error_code)> cb;

   work<error_code> w;
   work<error_code>::a_callback f =
      [cb](int64_t duration, error_code ec)
      {
      };
   w.async_call(f);
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: ошибка ambiguous call to overloaded function vs2013
От: prog123 Европа  
Дата: 17.05.17 10:59
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, prog123, Вы писали:


P>>Да, в 2015 нормально, а надо в 2013. Как можно обойти, есть идеи?


R>у меня 2013-й под рукой нет. Что если так:


R>
R>int main(int, char**)
R>{
R>   std::function <void(error_code)> cb;

R>   work<error_code> w;
R>   work<error_code>::a_callback f =
R>      [cb](int64_t duration, error_code ec)
R>      {
R>      };
R>   w.async_call(f);
R>}
R>


да, спасибо
Re: ошибка ambiguous call to overloaded function vs2013
От: N. I.  
Дата: 17.05.17 12:22
Оценка: 9 (2)
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
От: Кодт Россия  
Дата: 17.05.17 16:29
Оценка: +1
Здравствуйте, prog123, Вы писали:

<>

Может быть, проще избавиться от перегрузки метода по типу сигнатуры? Будут там async_callback(function<void(T)>) и async_callback_ex(function<void(time_t,T)>)?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.