10
4

1 回答 1

10

在您的情况下,问题不在于可能从/到 different 的转换std::shared_ptr,而是与模板函数的类型推断如何工作有关。

当编译器尝试将函数调用与模板匹配时,它将只接受完全匹配,即根本不接受类型转换。在这种情况下,您的函数采用 a std::shared_ptr<const T>,而调用者采用std::shared_ptr<U>where Uis not const。因为匹配不是精确的,它会丢弃模板并选择下一个重载候选。

简单的解决方法是:完全避免类型推断并提供模板参数:

std::shared_ptr<A> p;
foo<A>(p);             // will use the templated shared_ptr conversion

或者自己执行转换:

foo(std::shared_ptr<const A>(p));
于 2012-10-03T15:56:36.900 回答