将矢量>复制到矢量>(不同情况)C

前端之家收集整理的这篇文章主要介绍了将矢量>复制到矢量>(不同情况)C前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个:
std::vector<std::shared_ptr<T>>

我想复制到哪一个

std::vector<std::shared_ptr<const T>>

现在我注意到如果我这样做:

class A
{
public:
    A(const std::vector<std::shared_ptr<int>>& list) : internalList(list.begin(),list.end()) {}
    std::vector<std::shared_ptr<const int>> internalList;
};

它编译得很好(clang std == c 14)但如果我这样做:

class A
{
public:
    A(const std::vector<std::shared_ptr<int>>& list) : internalList(list) {}
    std::vector<std::shared_ptr<const int>> internalList;
};

我觉得很奇怪,当我使用复制构造函数时,它不起作用,因为它无法弄清楚从非const到const的转换?

xxxx.cpp:672:56: error: no matching constructor for initialization of 'std::vector<std::shared_ptr<const int> >'

有人可以解释为什么请,如果我这样做(在构造函数中使用迭代器)是最好的解决方案?

解决方法

首先,用不同类型实例化的类模板完全是不同类型的.然后std :: shared_ptr< int>和std :: shared_ptr< const int>是完全不同的类型,std :: vector< std :: shared_ptr< int>>和std :: vector< std :: shared_ptr< const int>>也是不同的类型,不能互相转换.

根据std :: vector的constructors,复制构造函数(第5个)采用与其参数类型相同的std :: vector.它意味着对于std :: vector< std :: shared_ptr< const int>>,它不能采用std :: vector< std :: shared_ptr< int>>,它们无法转换为std :: vector&lt ; std :: shared_ptr< const int>>含蓄.

另一方面,构造函数采用迭代器范围(第4个)是函数模板,迭代器的类型是模板参数,它不必是指向相同类型的迭代器.如果此类型可用于构造向量,则允许它是指向其他类型的迭代器.的std :: shared_ptr的< INT>可以用来构造std :: shared_ptr< const int>,然后就可以了.

请注意,std::shared_ptr具有复制/移动构造函数模板,这些模板可以将std :: shared_ptr作为其参数使用不同的元素类型. (虽然std :: vector没有.)

猜你在找的C&C++相关文章