我尝试向一些新代码引入一些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>)
答案 0 :(得分:10)
您的案例中的问题不在于来自/到不同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));