2016-11-11 7 views
1

を私はブーストを読んでいたとき:: unordered_mapソースコードを、クラスの定義についてI'wasが混乱し、以下のように:テンプレート引数控除 - 後押し:: unordered_map

template <class K, class T, class H, class P, class A> 
class unordered_map 
{ 
    public: 
    typedef K key_type; 
    typedef std::pair<const K, T> value_type; 
    typedef T mapped_type; 
    typedef H hasher; 
    typedef P key_equal; 
    typedef A allocator_type; 
private: 
    typedef boost::unordered::detail::map<A, K, T, H, P> types; 
    typedef typename types::traits allocator_traits; 
    typedef typename types::table table; 
... 
private: 
    table table_; 

public: 
    // constructors 
    explicit unordered_map(
      size_type = boost::unordered::detail::default_bucket_count, 
      const hasher& = hasher(), 
      const key_equal& = key_equal(), 
      const allocator_type& = allocator_type()); 
... 
}; 

のクラスにはデフォルト値はありませんH、クラスP、クラスAの場合、なぜboost::unordered_map<Key, Value> mapのようなマップインスタンスを宣言できますか? ガイドが見つかりませんでした。誰でも助けてくれますか?詳細な文書/リンクが最適です。

+2

これは定義です。宣言が見つかりましたか? – songyuanyao

答えて

2

をテンプレートパラメータのすべてのデフォルトを指定します。 (その宣言は実際のヘッダーファイルにはないかもしれませんが、内部ヘッダーファイルはそこから#includedです)。

宣言が最初にコンパイルされ、デフォルトが宣言されます。実際のテンプレート定義がここに表示されます。

初期テンプレート宣言ではすでにテンプレートパラメータのデフォルトを指定しています。このテンプレート定義では指定する必要はありません(実際にはコンパイルエラーが発生します)。

簡単な例:

// Initial declaration 

template<typename T=int> class foo; 

// Definition 

template<typename T> class foo {}; 

// Usage 
foo<> bar; 

実過給ヘッダファイルはで組み立てられ得る種々の雑多な理由のために、宣言と別々のファイルにまたがるテンプレートの定義と、その構造中にかなり複雑ですあなたのコードに実際のヘッダファイル#includeによって正しい順序があります。

+0

もう一度ありがとうございます。これは、テンプレートクラスが事前宣言を持つことができることを初めて知っています。しかし、stl :: mapではこのスタイルは使用しません。したがって、追加の質問は、そのような宣言にどのような利点があるのでしょうか? –

+0

- 最後のセクションのコメントが表示されます。このようなプログラミング思想/原理/経験を導入するための本や文書があるかどうかは分かりますか? –

4

<boost/unordered/unordered_map.hpp>次の宣言が含まれ、<boost/unordered/unordered_map_fwd.hpp>が含まれています。あなたが最初のヘッダファイル、あなたが実際に#include、あなたがいることを、このテンプレートの宣言を見つけるつもりされている1つを見て起動すると

template <class K, 
    class T, 
    class H = boost::hash<K>, 
    class P = std::equal_to<K>, 
    class A = std::allocator<std::pair<const K, T> > > 
class unordered_map; 
関連する問題