ptr_map einfügen
Habe ich einige vordefinierte Typen, die erbt boost::noncopyable (so habe ich zum speichern der Zeiger auf diese Objekte). Ich benutze eine boost::ptr_map. Ich weiß, wird das zweite argument es ist bereits ein Zeiger. Also, der code:
ptr_map<string, boost::any> SomeMap;
typedef %Some noncopyable class/signature% NewType;
//Inserting now
boost::any *temp = new boost::any(new KeyEvent());
SomeMap.insert("SomeKey", temp);
Der Fehler ist:
error: no matching function for call to ‘boost::ptr_map<std::basic_string<char>, boost::any>::insert(const char [11], boost::any*&)’
UPD: Wenn ich nicht bestehen, die Zeiger auf die jeder any temp = any(new KeyEvent());
Bekomme ich:
error: no matching function for call to ‘boost::ptr_map<std::basic_string<char>, boost::any>::insert(const char [11], boost::any&)’
- Warum nicht
SomeMap["SomeKey"] = temp;
? - das kompilieren wird, aber es ist nicht exception-sicher.
temp
wird Auslaufen, wenn Sie entweder den string-Konstruktor oder der leer-element-insertion wirft. - Seymour: Du hast Recht. Das ist es, was ich für die Verwendung von nur smart-Pointer für mehrere Jahre.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese version von
insert
nimmt den Schlüssel von nicht-const-Referenz, das heißt, Sie können nicht verwenden Sie eine temporäre als der erste Wert. Dies ist, um Speicherverluste zu verhindern; in Ihrem codetemp
würde Auslaufen, wenn die string-Konstruktor werfen.Müssen Sie entweder das key-Objekt vor dem erstellen des raw-pointer:
oder verwenden Sie eine
auto_ptr
um sicherzustellen, dass das Objekt gelöscht wird, was auch immer geschieht:no matching function for call to ‘std::auto_ptr<boost::any>::auto_ptr(NewType*)’