Ответ 1
Проблема в вашем случае не связана с возможными преобразованиями из/в разные std::shared_ptr
, но больше связана с тем, как работает вывод типа для функций шаблона.
Когда компилятор пытается сопоставить вызов функции с шаблоном, он будет принимать только соответствия точные, т.е. никаких преобразований типов вообще. В этом случае ваша функция принимает std::shared_ptr<const T>
, а вызывающая сторона имеет std::shared_ptr<U>
, где U
не const
. Поскольку совпадение не точное, оно отбрасывает шаблон и выбирает следующего кандидата перегрузки.
Простые обходные пути: избегайте типичного вывода и предоставляйте аргумент шаблона:
std::shared_ptr<A> p;
foo<A>(p); // will use the templated shared_ptr conversion
Или выполните преобразование самостоятельно:
foo(std::shared_ptr<const A>(p));