Uncopyable对象,map和shared_ptr:复制构造函数中的错误

时间:2016-05-27 15:26:15

标签: c++ dictionary copy shared-ptr copy-constructor

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

[('Recording start', 0), ('Event marker 1', 150)]

如果我假设我的对象A是不可复制的,它就不起作用。作为一个指针,我希望我的对象A能够理解Derived是一个Base,但我收到以下消息:

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));
}

感谢。

1 个答案:

答案 0 :(得分:3)

该错误与A的不可复制性无关,实际上不在复制构造函数中 - 它位于map构造函数中。该错误与A'构造函数采用

的事实有关
std::map<std::string, std::shared_ptr<Base>> &

你传递的是:

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

属于T类型的左值引用的参数只能通过类型T的左值或从T派生的类型(或带{的类型来满足) {1}})。但是operator T&实际上并不是从std::map<std::string, std::shared_ptr<Derived>>继承 - 两种类型也没有相关 - std::map<std::string, std::shared_ptr<Base>>没有交叉类型构造函数。

换句话说,仅仅因为std::mapD并不意味着Bmap<X, D>。以这种方式,C ++类型系统中没有类型的协方差。某些类型至少允许您从map<X, B>构建Class<B>(例如Class<D>),但标准容器的情况并非如此(例如std::shared_ptr,{{1} },...)

您必须将vector更改为暂停map才能使其生效。它可以在内部保留lMap - 但std::shared_ptr<Base>类型必须匹配。

旁注,在C ++ 11中,您不需要std::shared_ptr<Derived>。您可以简单地map这些操作:

Uncopyable