2016-07-08 17 views
-1

Ich habe einen Vektor:Zugang Mitglied eines Iterator eines Vektors von unique_ptr

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

Ich möchte das Element „id“ in einer Schleife für den Zugriff auf und ein bestimmtes Element löschen:

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

diese Linie ...

if (it->id == 2) 

gibt mir eine Fehlermeldung:

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

Dies scheint zu funktionieren:

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

Ich frage mich, warum ?! Hier ist der vollständige Code: http://ideone.com/kFohfA

Antwort

6

it ein Iterator ist so it-> versucht, ein Mitglied der in dem Vektor gespeichert zuzugreifen (std::unique_ptr<MyAbstract>) nicht die MyAbstract die std::unique_ptr hält. Was Sie tun müssen, ist dereferenzieren Iterator bekommen die std::unique_ptr<MyAbstract> zugrunde liegenden und dann können Sie das Mitglied von MyAbstract mit -> wie

(*it)->id 
+0

Dank zugreifen, ich wusste, dass es wegen der zugrunde liegenden Typ, aber ich dachte, das -> würde magisch auf den MyAbstract innerhalb von unique_ptr zeigen, so dass ich get() nicht verwenden müsste. – DoubleVoid

+2

@DoubleVoid Wenn das der Fall wäre, könnten Sie nicht einfach auf die Mitglieder von 'std :: unique_ptr' zugreifen. – NathanOliver

2

*it hat std::unique_ptr<MyAbstract> geben, natürlich hat es kein Mitglied genannt id.

Also muss man seinen "Wert" erhalten, über get():

it->get()->id