2017-02-01 9 views
2

У меня есть программа, которая дает мне смутное ошибку, поэтому вместо того, размещать сотни строк кода, которые я сделал эту упрощенную версию:C++ - unique_ptr в пределах unordered_map приводит к ошибкам

#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)); 
} 

ошибка (GCC 4,8 с C++ 11) относительно либо unique_ptr или unordered_map, я считаю:

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>]' 

Возможно, где-то в коде unique_ptr копируется? Это единственное, что я мог подумать, что может вызвать такую ​​ошибку.

Любая помощь приветствуется!

ответ

3

Ошибка здесь:

wd_ptr.children=children; 

Это пытается копиюchildren в wd_ptr.children. Вы должны изменить его на:

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

Это довольно прискорбно, что ни НКУ, ни лязг способен производить диагностику, что на самом деле говорит вам, какая строка кода является неправильным.

+0

Это действительно интересно; g ++ обычно показывает, какая строка кода, но она [явно не для этого примера] (http://coliru.stacked-crooked.com/a/80e9b5ae43362e32), даже для g ++ v6.3 (http: //coliru.stacked -crooked.com/a/c19194654682c731). Должно ли это быть зарегистрировано как ошибка в gcc? – Justin

+0

@ Justin Я так думаю. Вы можете подать ошибку, если хотите, хотя я, вероятно, не стал бы беспокоиться, поскольку я полагаю, что это, вероятно, будет дубликат существующей ошибки, и я слишком ленив, чтобы проверить. – Brian