我尝试向某些新的代码介绍一些const正确性(实际功能范例),发现我不能通过std :: shared_ptr< A>到一个期望std :: shared_ptr< A const>的函数.请注意,我不想抛弃const,而是介绍它,这与原始指针是合法的.
有没有办法解决这个问题?我没有找到一个成员函数来做到这一点.
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));