У меня есть проблема с передачей параметров const ref для функций шаблона, вызывающих другие функции. Рассмотрим следующий код:Параметр аргумента аргумента функции неоднозначный для типов const ref
struct A
{
void foo(const int& i) { }
};
template <class ...Args>
void a_caller(A& a, void(A::*f)(Args...), Args&& ...args)
{
(a.*f)(std::forward<Args>(args)...);
}
int main()
{
int i = 42;
A a;
a_caller(a, &A::foo, i); // (1) compiler error
a_caller<const int&>(a, &A::foo, i); // (2) ok
}
Итак, у меня есть функция члена A::foo
с const int&
аргумент, который я хочу, чтобы позвонить в обертке a_caller
. Линия (1) вызывает следующую ошибку:
'void a_caller(A &,void (__thiscall A::*)(Args...),Args &&...)' : template parameter 'Args' is ambiguous
see declaration of 'a_caller'
could be 'const int&'
or 'int&'
Мой первый вопрос, почему это происходит? Я даю компилятору неперегруженную функцию A :: foo, почему он не может вывести из нее Args
? Второй вопрос: почему этого не происходит для std :: make_unique? Следующий код выглядит так же для меня, но компилятор не имеет никаких проблем выводя конструктор типа аргумента:
struct A
{
A(const int& i) { }
};
int main()
{
int i = 42;
auto aptr = std::make_unique<A>(i);
}
Спасибо за подсказку с указателем метода в качестве шаблона PARAM - выглядит короче, что предложение Angew (за исключением случаев, когда возврат тип метода не важен) – Lao