2016-11-18 2 views
-6

私はハッシュマップのキーとしてこれをしたいので、私は、私はこれを行う構造体なぜunordered_mapは初期化のために一致するコンストラクタがないと言っていますか?

struct Key { 
    double x; 
    double y; 
    double z; 

    bool operator==(const Key& k) const{ 
     return (x == k.x && y == k.y && z == k.z); 
    } 
} 

を持っています。

それから私は

std::unordered_map<Key, int> map = {{1.01, 2.02, 3.03}, 333}; 

を行うと、私はコンストラクタとして初期化リストを使用したいが、私はエラーno matching constructor for initialization of 'std::unordered_map<key, int> map = {{1.01, 2.02, 3.03}, 333};'

+0

すべてのことができるときに、システムが無秩序なマップを構築することを期待していますか?それは何に基づいてマップするでしょうか? –

+0

コンパイラの種類はわかりませんが、 'gcc'は非常に分かりやすいメッセージを出力します。' 'エラー:' '(const std :: hash ) //ideone.com/7gm9Tk)。 –

+2

[mcve]を入力してください。これは1つではありません。 – Barry

答えて

5

{{{1.01, 2.02, 3.03}, 333}}を試してみてください代わりに{{1.01, 2.02, 3.03}, 333}

コンテナが要素のリストで初期化することができます取得します、 1つの要素を構成する方法に関する指示ではありません。

+2

鍵はハッシュ可能ではありません。それが理由だと思います。 –

+2

@EdgarRokyan鍵がハッシュ可能でないという証拠は見当たりません。 'std :: hash'特殊化は他の場所にも存在する可能性があります。もしそうでなければ、ハッシュ可能ではないとコンパイラエラーが発生しません。 – Yakk

+2

@Yakkはい余分な中かっこが問題を解決しました。 – pokche

3

ここにはいくつかの問題があります。

まず、Keyタイプのハッシュ関数を定義していません。 unordered_mapKeyをキーとして使用するには、等価演算子(作成済み)と特殊化std::hashの両方が必要です。したがって、あなたは次のようなことをする必要があります:

namespace std { 
    template <> struct hash<Key> { 
     unsigned operator()(const Key& arg) const { 
      return /* some hash code */ 
     }  
    }; 
} 

第2に、初期化子リストに括弧のレベルが少なすぎます。

std::unordered_map<Key, int> map = {{{1.01, 2.02, 3.03}, 333}}; 

これは、これらの変更でコンパイル:あなたが最初のマップの内容などの単一のキーと値のペアを使用したい場合、あなたは余分な括弧が必要になりますので、期待初期化子リストは、キー/値ペアのリストです;確認のためにthis demoを参照してください。

+0

ハッシュファンクタがあるかどうかわからない。提供される唯一のエラーメッセージは、ハッシュファンクタがないことを示していません。中括弧もありません。 – NathanOliver

+0

'std :: hash'の代わりに' namespace std'を使う理由はありますか? – pokche

+0

@NathanOliverああ、中括弧をうまくキャッチしています。元のものをコピー&ペーストして編集を忘れました。そして、あなたは正しい - 私たちはこれを確実には知らないが、OPにはクラス定義全体が含まれているため、おそらくそれを含んでいないと思われる。 – templatetypedef

関連する問題