不可复制的对象,映射和shared_ptr:复制构造函数中的错误

卡纳迪尼

我在构造不可复制的对象时遇到问题。让我们考虑以下示例:

class Uncopyable{
protected:
    Uncopyable(){};
    ~Uncopyable(){};

private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
};


class Base { };
class Derived : public Base { };

class A : private Uncopyable {
public:
    A(std::map<std::string, std::shared_ptr<Base>> & inMap);
private:
    A(const A&);
    A& operator=(const A&);
};

int main() {
    std::map<std::string, std::shared_ptr<Derived>> lMap;
    std::shared_ptr<A> oA(std::make_shared<A>(lMap));
}

如果我假设我的对象A是不可复制的,那么它将无法正常工作。作为一个指针,我希望我的对象A能够理解Derived是一个Base,但是却收到以下消息:

error C2664: 'A::A(const A &)' : cannot convert argument 1 from 'std::map<std::string,std::shared_ptr<Derived>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'std::map<std::string,std::shared_ptr<Base>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &'
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::shared_ptr<Derived>
1>          ]
1>          and
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::shared_ptr<Base>
1>          ]

谢谢。

巴里

该错误与A的不可复制性无关,并且确实不在复制构造函数中-而是在map构造函数中。该错误与以下事实有关:A'构造函数采用

std::map<std::string, std::shared_ptr<Base>> &

并且您正在通过:

std::map<std::string, std::shared_ptr<Derived>>

作为类型的左值引用的参数T只能由类型的左值T或派生自T(或带有的类型的operator T&左值来满足但是std::map<std::string, std::shared_ptr<Derived>>实际上并没有继承std::map<std::string, std::shared_ptr<Base>>-两种类型也根本没有关联-没有的交叉类型构造函数std::map

换句话说,仅仅因为aD是aB并不意味着amap<X, D>是a map<X, B>以这种方式,C ++类型系统中没有类型的协方差。某些类型至少可以让你构建一个Class<B>Class<D>(例如std::shared_ptr),但是这不是标准集装箱的真实(例如vectormap,...)

您必须更改lMap为按住std::shared_ptr<Base>s才能起作用。它可以在内部保留std::shared_ptr<Derived>s-但map类型必须匹配。


旁注,在C ++ 11中,您不需要Uncopyable您可以简单地显式地执行delete这些操作:

A(A const& ) = delete;
A& operator=(A const& ) = delete;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不可复制的对象,映射和shared_ptr:复制构造函数中的错误

来自分类Dev

具有shared_ptr成员的C ++复制构造函数

来自分类Dev

具有shared_ptr成员的C ++复制构造函数

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

std :: shared_ptr模板化与非模板化的复制/移动构造函数

来自分类Dev

C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

来自分类Dev

std :: shared_ptr模板化与非模板化的复制/移动构造函数

来自分类Dev

给定其shared_ptr,如何正确复制对象

来自分类Dev

std :: shared_ptr在复制对象时引起问题

来自分类Dev

给定其shared_ptr,如何正确复制对象

来自分类Dev

shared_ptr析构函数,复制和不完整类型

来自分类Dev

使用shared_ptr时需要实现析构函数,复制构造函数,赋值运算符

来自分类Dev

shared_ptr 的复制分配会导致分段错误吗?

来自分类Dev

同时重置和复制shared_ptr线程安全吗?

来自分类Dev

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

来自分类Dev

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

来自分类Dev

在lambda中锁定std :: shared_ptr的复制操作

来自分类Dev

gcc shared_ptr复制分配实现

来自分类Dev

复制构造函数中的std :: copy错误

来自分类Dev

使用 shared_ptr 而不是 unique_ptr 作为类成员只是为了避免隐式复制构造函数删除是否明智?

来自分类Dev

shared_ptr别名构造函数

来自分类Dev

使用shared_ptr的虚拟构造函数

来自分类Dev

无法在 C++17 中构造包含 const int 和不可复制(但可移动)对象的对

来自分类Dev

C ++中的构造函数和复制构造函数行为

来自分类Dev

复制或移动具有成员std :: mutex(或其他不可复制对象)的类的构造函数?

来自分类Dev

奇怪的复制构造函数和析构函数错误

来自分类Dev

shared_ptr <Base>和派生类中的对象

来自分类Dev

shared_ptr <Base>和派生类中的对象

Related 相关文章

  1. 1

    不可复制的对象,映射和shared_ptr:复制构造函数中的错误

  2. 2

    具有shared_ptr成员的C ++复制构造函数

  3. 3

    具有shared_ptr成员的C ++复制构造函数

  4. 4

    std :: shared_ptr深层复制对象

  5. 5

    std :: shared_ptr深层复制对象

  6. 6

    std :: shared_ptr模板化与非模板化的复制/移动构造函数

  7. 7

    C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

  8. 8

    std :: shared_ptr模板化与非模板化的复制/移动构造函数

  9. 9

    给定其shared_ptr,如何正确复制对象

  10. 10

    std :: shared_ptr在复制对象时引起问题

  11. 11

    给定其shared_ptr,如何正确复制对象

  12. 12

    shared_ptr析构函数,复制和不完整类型

  13. 13

    使用shared_ptr时需要实现析构函数,复制构造函数,赋值运算符

  14. 14

    shared_ptr 的复制分配会导致分段错误吗?

  15. 15

    同时重置和复制shared_ptr线程安全吗?

  16. 16

    shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

  17. 17

    shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

  18. 18

    在lambda中锁定std :: shared_ptr的复制操作

  19. 19

    gcc shared_ptr复制分配实现

  20. 20

    复制构造函数中的std :: copy错误

  21. 21

    使用 shared_ptr 而不是 unique_ptr 作为类成员只是为了避免隐式复制构造函数删除是否明智?

  22. 22

    shared_ptr别名构造函数

  23. 23

    使用shared_ptr的虚拟构造函数

  24. 24

    无法在 C++17 中构造包含 const int 和不可复制(但可移动)对象的对

  25. 25

    C ++中的构造函数和复制构造函数行为

  26. 26

    复制或移动具有成员std :: mutex(或其他不可复制对象)的类的构造函数?

  27. 27

    奇怪的复制构造函数和析构函数错误

  28. 28

    shared_ptr <Base>和派生类中的对象

  29. 29

    shared_ptr <Base>和派生类中的对象

热门标签

归档