使用shared_ptr到const T的C模板实例化

假设我有一堂课

template <typename T>
class A {
 public:
  template <typename V>
    void f(std::tr1::shared_ptr<const std::vector<V> > v1, 
           std::tr1::shared_ptr<const std::vector<float> > v2) {}
};

以下内容无法编译:

A<string> a;
  std::tr1::shared_ptr<std::vector<float> > v1(new std::vector<float>());
  std::tr1::shared_ptr<std::vector<float> > v2(new std::vector<float>());
  a.f(v1, v2);

编译器错误是:

error: no matching function for call to 'A<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::f(std::tr1::shared_ptr<std::vector<float, std::allocator<float> > >&, std::tr1::shared_ptr<std::vector<float, std::allocator<float> > >&)'

编译器无法生成std :: tr1 :: shared_ptr< std :: vector< float> >成
std :: tr1 :: shared_ptr< const std :: vector< float> >第一个论点.然而它可以用于第二个(非模板参数).

对此的一个解决方案是将调用更改为f(),将其称为f< float>(…).
另一个解决方案是将v1声明为shared_ptr到const vector< float>.

>为什么模板实例化在这里表现得如此不同?
>我对shared_ptr< const T>的理解作为方法的参数是该方法不能改变shared_ptr指向的内容.如果我们将shared_ptrs更改为原始指针并将v1,v2更改为向量的原始指针,那么代码将编译正常.什么是shared_ptrs打破模板扣除?

Why is template instantiation behaving so differently here?

shared_ptr< T>可隐式转换为shared_ptr< const T>通过转换构造函数.遗憾的是,在模板参数推断期间无法使用此类转换.

为了使参数推断成功,参数的类型必须与参数的类型完全匹配;不使用大多数转化,包括用户定义的转化.

只允许几个非常基本的转换,包括数组到指针的衰减和函数到函数指针的转换(因为没有函数参数可以是数组类型或函数类型,这些转换不会导致混淆).此外,顶级const和volatile限定符完全被忽略.

相关文章
相关标签/搜索