2017-02-01 9 views
2

につながる:C++ - unordered_map内unique_ptrを、私は私のあいまいなエラーを与えているプログラムを持っているので、ではなく、私はこの簡易版作ったコードの行数百人の投稿エラー

#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)11 C++での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; 

これはwd_ptr.childrenコピーchildrenにしようとします。これは、GCCでも打ち鳴らすどちらが実際にあなたのコードの行が間違っているかを示しますその診断を生成することが可能であることを、むしろ残念だ

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

:あなたはそれを変更する必要があります。

+0

これは本当に面白いです。 g ++は通常どのコード行を表示しますか?g ++ v6.3(http://coliru.stacked)の場合でも、[この例では明確にはありません](http://coliru.stacked-crooked.com/a/80e9b5ae43362e32) -crooked.com/a/c19194654682c731)。これはgccのバグとして提出する必要がありますか? – Justin

+0

@Justinそう思う。あなたが望むならば、バグを報告することはできますが、おそらく既存のバグと重複していると思うので気にしないでしょう。私はチェックするのが面倒です。 – Brian

関連する問題