2012-04-05 15 views
3

私がのstd ::マップのランタイム発注の実装を検索し、この解決策を見つけた: STL std::map dynamic ordering奇妙な使用法は

それは私にとっては明らかですが、私はどのようにそれを理解していませんstd :: mapのコンストラクタでOrderingTypeを使用することができます。 std :: mapにはコンストラクタがあり、コンパレータオブジェクトを引数として取得します。だから、このようなコードを使用するように私の視点から正常です:

int main() 
{ 
    Ordering<int> test_ordering(ASCENDING); 
    CUSTOMMAP map1(test_ordering); 

    return 0; 
} 

しかし、コードを上記のトピックからもコンパイル:

int main() 
{ 
    CUSTOMMAP map1(ASCENDING); 
    //... 
    return 0; 
} 

私は理解していない、それが動作する理由:のコンストラクタをstd :: mapは、Orderingクラスオブジェクト自体の代わりにOrderingType列挙型の引数を取得してはいけません。

+0

私はこの絵のどこにでも 'std :: map'が表示されません。 –

+0

私はちょうど上記のトピックからコードのブロックを取った。おそらく、私はそれを完全に引用したはずです。私はそれがリンクを残すよりも良いのか分からない。 –

+0

さて、私は今それを見る。 –

答えて

9

あなたの列挙を取るOrdering<int>上のコンストラクタはexplicitとして宣言されていない場合、それはコンパイラがOrdering<int>タイプにあなたの列挙型から変換する必要があるときに自動的に挿入することができ、「変換コンストラクタ」と考えられています。

CUSTOMMAP map1(ASCENDING); 

をし、これに変換し::だからコンパイラはこれを効果的に取っている。これは、暗黙の型変換と呼ばれる

CUSTOMMAP map1(Ordering<int>(ASCENDING)); 

+0

あなたの返事をありがとう。 –