2017-05-03 4 views
0

struct varにはメンバーstd::unordered_map<var, var>がありますか?std :: unordered_map <Class、Class>をClassのメンバーとして持つことは可能ですか?

namespace json 
{ 
    struct var; 
    using dict = std::unordered_map<var, var>; 

    struct var 
    { 
     int integer = 0; 
     std::string string = ""; 
     dict json_dict = dict(); 
    } 
} 

namespace std 
{ 
    template<> struct hash<json::var> 
    { 
     std::size_t operator()(const json::var& k) const 
     { 
      return hash<string>()(k.string); 
     } 
    }; 
} 

は、好ましくは、ポインタを使用せずに解決策はあります:hash<json::var>dict json_dict = dict();の使用後に宣言されているので、ここで

がコンパイルされていないコード例ですか?

答えて

1

あなたが自分自身をjson::varを定義した後、あなたはhash<json::var>::operator()を定義することができますが:

namespace json 
{ 
    struct var; 
} 

namespace std 
{ 
    template<> struct hash<json::var> 
    { 
     // just a declaration: 
     std::size_t operator()(const json::var& k) const; 
    }; 
} 

namespace json 
{ 
    using dict = std::unordered_map<var, var>; 

    struct var 
    { 
     int integer = 0; 
     std::string string = ""; 
     dict json_dict = dict(); 
    }; 
} 

// definition: can access `json::var`'s members 
std::size_t std::hash<json::var>::operator()(const json::var& k) const 
{ 
    return k.integer; 
} 

live wandbox example


無関係が、

string string = ""; 
dict json_dict = dict(); 

に相当します
string string; 
dict json_dict; 
+1

これは、libC++の 'std :: unordered_map'が不完全な型を許可するためにのみ動作するということを付け加えたいと思います。これは現在、例えばlibstdC++では動作しません。 –

関連する問題