Я пытался представить некоторые const
правильность (на самом деле функциональные парадигмы) к некоторому новому коду и обнаружил, что я не могу передать std::shared_ptr<A>
к функции, которая ожидает std::shared_ptr<A const>
, Обратите внимание, что я не хочу бросать далеко constness, но представьте его, что законно с указателями.
Есть ли способ обойти это? Я не нашел функции-члена для этого.
Точная ошибка, произнесенная g ++ 4.6.1:
error: no matching function for call to ‘foo(std::shared_ptr<A>)’
note: candidate is:
note: template<class T> std::shared_ptr<_Tp> foo(std::shared_ptr<const _Tp>)
Проблема в вашем случае не в возможных конверсиях из / в разные 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));
Других решений пока нет …