У меня проблема с созданием моего объекта, не подлежащего копированию. Пусть рассмотрим следующий пример:Uncopyable object, map и 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));
}
Если я предполагаю, что мой объект А быть не копируемыми, не work.As указатель, я ожидаю, мой объект А, чтобы понять, что производный является базовой, но вместо этого я я получаю следующее сообщение:
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> ]
Спасибо.
Я вижу, что вы указываете, это очень ясно. Итак, если функция f принимает в качестве аргумента std :: shared_ptr, и я определяю std :: map > lMap. Я назначаю lMap [0] std :: shared_ptr . Невозможно использовать lMap [0] для f? –
Canardini
@Canardini Если 'f' принимает' shared_ptr', то вы не можете передать 'shared_ptr ' ему, да. Как он узнает, что он на самом деле указывает на объект 'Derived'? –
Barry
Правильно, это то, что я понял из вашего ответа. Я попытался использовать динамический указатель броска, он не смог решить проблему. – Canardini