2015-08-03 7 views
0

У меня есть пара вопросов об использовании unique_ptr в контейнере. Это то, что я пытаюсь сделать:карта 2 unique_ptr's

class Stuff 
{ 
public: 
    std::map<std::unique_ptr<int>, std::unique_ptr<int> > GetInfo() {return m_mapInfo;} 

    // Is this bad?? 
    std::map<std::unique_ptr<int>, std::unique_ptr<int> > MoveInfo() {return std::move(m_mapInfo);} 

private:  
    std::map<std::unique_ptr<int>, unique_ptr<int> > m_mapInfo; 
}; 

Это не скомпилировано. Это дает мне ошибку C2248. Я использую VS2012.

Теперь я не использую unique_ptr's int; они на самом деле unique_ptr для абстрактных базовых классов, но я хотел удалить любые проблемы, связанные с тем, была ли ошибка связана с моими операциями copy/move constructors/assign.

Может ли кто-нибудь объяснить ошибку и как ее исправить?

Во-вторых, является ли моя функция MoveInfo() плохой практикой? Он может быть вызван только один раз для каждого объекта Stuff, так как член карты будет пуст после него, да?

спасибо.

+0

Извините, я забыл, что говорит 'C2248'. –

+0

'm_mapInfo' не копируется, поэтому' GetInfo' ошибочно, вы хотите вернуть ссылку вместо этого? – Jarod42

+0

@ πάνταῥεῖ: [C2248] (https://msdn.microsoft.com/en-us/library/tsbce2bh.aspx) является ошибкой с видимостью. – Jarod42

ответ

1

unique_ptr предназначены для использования и хранения права на указатель, то есть быть уникальным. Вот почему они не copiable.

Возвращение копии на карту означало бы дублировать (копировать) все содержимое, которое невозможно из-за уникального_ptr. Вот почему вы получаете сообщение C2248.

Либо верните ссылку на карту, либо рассмотрите возможность использования shared_ptr (чтобы несколько карт могли совместно использовать ссылку на тот же указатель).

+0

Но OP 'move'd на карте. Где копия? – nwp

+0

@nwp OP имеет функцию GetInfo(), которая возвращает карту по значению, что означает ее копирование. – Christophe