Компилятор же написал — не может выбрать, какой из двух call_method выбирать. Потому что clear возвращает void и теперь обе перегрузки делают одно и то же. Я бы предложил просто убрать первый call_method и починить его: template< typename T, typename RetType, typename ...Args> RetType call_method( T& object, RetType(T::*method)(Args&&... a), Args&& ... args) Тут стоит подумать о том — а что, если method принимает вообще не ссылку (что у нас и произошло)
тут вроде нет ругани на ambiguous
У меня на Clang и MSVC действительно нет, а вот GCC выдаёт и я его понимаю: error: call of overloaded 'call_method(A&, void (A::*)())' is ambiguous 32 | call_method(obj, &A::clear);
А что не так с std::invoke?
А тут нельзя себе ногу прострелить успешно?
Обсуждают сегодня