shared_ptr<const wstring> Problem
-
Hi,
vielleicht kann mal bitte jemand draufgucken und sieht den Fehler, mir erschließt er sich im Moment nicht.
ich benutze shared_ptr zum ersten mal und ich habe einen Fehler den ich mir nicht so ganz erklären kann.
Der Compiler zeigt in der initialize Funktion beim dereferenzieren des it iterators einen Fehler.Ich habe einen shared_ptr<const wstring> vector;.
e.g.//Ausschnitt aus Klasse (hpp) class Foo{ private: std::vector<std::shared_ptr<const std::wstring>> filenames; void initialize(); bool fill_action_list(shared_ptr<const wstring> & filepath); }; //cpp void Foo::initialize() { vector<shared_ptr<const wstring>>::const_iterator it; for (it = filenames.cbegin(); it != filenames.cend(); ++it) { fill_action_list(*it); //das will der compiler nicht } } bool Foo::fill_action_list(std::shared_ptr<const std::wstring> & filepath){}Die compiler Fehlermeldung ist:
std::_Vector_const_iterator<...>::reference std::_Vector_const_iterator<...>::operator*() const
Error: Qualifizierer wurden im Bindungsverweis vom Typ ""std::shared_ptr<const std::wstring> &"" im Initialisierer vom Typ ""const std::shared_ptr<const std::wstring> "" abgelegt.
Gruß
Christian
-
Du verwendest C++11 - also nutze auch placeholder-Typen:
for (auto it = filenames.cbegin(); it != filenames.cend(); ++it) ...(Bzw. warum nicht gleich range-based for?)
_______________________________________________________________________________________________Zu deinem Problem: Du hast einen
const_iterator- wenn du einenconst_iteratordereferenzierst, bekommst du logischerweise auch eine Const-Referenz.
Der Funktionsparameter ist aber eine Referenz auf non-const.
passt nicht.Kurz: Nutze
begin()stattcbegin(gleiches gilt fürcend) und einen gewöhnlichenvector<..>::iterator, oder einfach direkt range-based for:for (auto& s : filenames) fill_action_list(s);Und darf man fragen warum du eine Referenz auf
shared_ptrnimmst?
Warum keine Referenz aufconst wstring? Das würde dein Problem ebenfalls lösen...
-
Danke! Funktioniert perfekt.
Vorher war der shared_ptr const, bevor ich nachgelesen habe wo man das const hintun muss damit der wstring const ist.Arcoth schrieb:
Du verwendest C++11 - also nutze auch placeholder-Typen:
for (auto it = filenames.cbegin(); it != filenames.cend(); ++it) ...(Bzw. warum nicht gleich range-based for?)
_______________________________________________________________________________________________Edit:
Ich wüsste aus dem Kopf nicht, wie ich die Schleife zu einer ranged-based for macheDanke für das ranged-based for Beispiel.Das klingt jetzt vielleicht doof und albern aber ich muss ehrlich sagen, dass mich auch der minimallistische Anblick der ranged-based for ein wenig abschreckt.
Ich habe irgendwie immer das Gefühl da fehlt etwas, allerdings habe ich auch das gleiche Problem bei "auto" iteratoren.Das ist mir irgendwie ein wenig unheimlich.
Arcoth schrieb:
Und darf man fragen warum du eine Referenz auf
shared_ptrnimmst?
Warum keine Referenz aufconst wstring? Das würde dein Problem ebenfalls lösen...Du meinst warum ich überhaupt die filenames in einem vector of shared pointer speichere statt in einem vector of wstrings?
Ich schreibe gerade ein kleines Testtool, in dem ich Placeholder Schlüssel mit Lokalisationsdateien resolve.
Ich lese mehrere Dateien und baue daraus action und resolve Objekte und schreibe im Fall von Fehlern errors in ein Logfile.Mein Problem ist jetzt, dass das resolve Objekt wissen muss, aus welchem File es erstellt wurde, damit ich falls ein Fehler auftritt auch sagen kann in welchem File der Fehler aufgetreten ist.
Ich dachte mir die beste Lösung ist einen shared_ptr zu verwenden, den ich dann per reference bis zu der Stelle Schleife an dem ich das resolve Objekt erstelle.Falls jemand eine bessere Idee hat bin ich dafür auch offen. ^^