构建我的不可复制对象时遇到问题。让我们考虑以下示例:
[('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));
}
感谢。
答案 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::map
是D
并不意味着B
是map<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