2017-02-01 2 views
2

Ich habe ein Programm, das mir einen vageen Fehler, so anstatt schreiben Hunderte von Zeilen von Code, den ich gemacht habe diese vereinfachte Version ist zu geben:C++ - unique_ptr innerhalb eines unordered_map führt zu Fehlern

#include <unordered_map> 
#include <memory> 
#include <utility> 

struct s 
{ 
    int height; 
    std::unordered_map<std::string, std::unique_ptr<s>> children; 
}; 

void InitWD(s &wd_ptr, int height, std::unordered_map<std::string, std::unique_ptr<s>> children) //Initialize a WindowData 
{ 
    wd_ptr.children=children; 
    wd_ptr.height=height; 
} 

int main() 
{ 
    s test; 
    test.height=1; 
    test.children=std::unordered_map<std::string, std::unique_ptr<s>>(); 
    std::unique_ptr<s> ptr(new s); 
    InitWD(*ptr, 2, std::unordered_map<std::string, std::unique_ptr<s>>()); 
    test.children.emplace("two", std::move(ptr)); 
} 

Der Fehler (GCC 4.8 mit C++ 11) in Bezug auf entweder die unique_ptr oder die unordered_map, glaube ich:

error: use of deleted function 'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<s>]' 

Vielleicht irgendwo im Code ein unique_ptr kopiert wird? Das ist das einzige, was mir einfällt, dass das einen solchen Fehler verursachen würde.

Jede Hilfe wird geschätzt!

Antwort

3

Der Fehler ist hier:

wd_ptr.children=children; 

Dieser versucht, Kopiechildren in wd_ptr.children. Sie müssen es ändern:

wd_ptr.children = std::move(children); 

Es ist ziemlich bedauerlich, dass weder gcc noch Klappern der Lage ist, ein Diagnose zu erzeugen, die Sie tatsächlich, welche Zeile des Codes sagt falsch ist.

+0

Das ist wirklich interessant; g ++ zeigt normalerweise an, welche Codezeile, aber [für dieses Beispiel eindeutig] (http://coliru.stacked-crooked.com/a/80e9b5ae43362e32) auch für g ++ v6.3 (http: //coliru.stacked -crooked.com/a/c19194654682c731). Sollte dies als Fehler in gcc abgelegt werden? – Justin

+0

@Justin Ich denke schon. Sie können einen Fehler ablegen, wenn Sie wollen, obwohl ich wahrscheinlich nicht stören würde, da ich denke, es wird wahrscheinlich ein Duplikat eines bestehenden Fehlers sein, und ich bin zu faul, um zu überprüfen. – Brian

Verwandte Themen