2016-07-08 7 views
-1

У меня есть вектор:член Доступ к итератора вектора unique_ptr

std::vector<std::unique_ptr<MyAbstract>> myList; 

Я хочу, чтобы получить доступ к элементу «идентификатор» в цикле и удалить определенный элемент:

for (auto it = myList.begin(); it != myList.end();) 
{ 
    if (it->id == 2) 
    { 
     it = myList.erase(it); 
     break; 
    } 
    else 
     ++it; 
} 

эта линия ...

if (it->id == 2) 

дает мне ошибку:

'class std::unique_ptr' has no member named 'id'

Это похоже на работу:

if (it->get()->id == 2) 

Интересно, почему ?! Вот полный код: http://ideone.com/kFohfA

ответ

6

it итератор так it-> попытки доступа к элементу типа, хранящегося в векторе (std::unique_ptr<MyAbstract>) не является MyAbstractstd::unique_ptr держит. Что вам нужно сделать, это разыменования итератора, чтобы получить основной std::unique_ptr<MyAbstract>, а затем вы можете получить доступ к члену MyAbstract с -> как

(*it)->id 
+0

Спасибо, я знал, что это из-за базового типа, но я думал -> будет волшебным образом указывает на MyAbstract внутри unique_ptr, поэтому мне не нужно будет использовать get(). – DoubleVoid

+2

@DoubleVoid Если бы это было так, вы не смогли бы легко получить доступ к элементам 'std :: unique_ptr'. – NathanOliver

2

*it имеет тип std::unique_ptr<MyAbstract>, конечно, не имеет ни одного члена с именем id.

Таким образом, вы должны получить его «значение», через get():

it->get()->id 

 Смежные вопросы

  • Нет связанных вопросов^_^