2013-04-17 118 views
0

我正在寫一個哈希表,但我遇到了一個困難。我想用非標準容器(向量,列表等)的內容對它進行初始化,如地圖:
map <string,int> m(a.begin(),a.end())
我對類的定義如下:template <class key,class val,class hashik=std_hash> class hash_table
我定義構造函數:使用STL迭代器的模板構造函數

template <template <class> class C> hash_table(typename C<pair <key,val> >::iterator first,typename C<pair <key,val> >::iterator last) 
{ 
    init(); 
    for(pair <key,val>* it=first;it!=last;++it) 
     this->operator[](it->first)=it->second; 
} 

不過,這並不編譯。 沒有匹配的調用函數。例如:

vector <pair <string,int> > a; 
... 
hash_table <string,int> m(a.begin(),a.end()); //compilation error 

我在做什麼錯?哪些關於模板的書可以建議我閱讀?

+0

你可以發表一個[示例](http://www.sscce.org/),其他人可以嘗試編譯? – Praetorian

回答

1

您試圖對您接受的類型過於具體。關鍵要記住的是,只要編譯模板,模板就會匹配任何東西。如果我正確破譯你的代碼,你有一類這樣的:

template <typename K, typename V> hash_table { /* ... */ }; 

聲明一個哈希表K類型的鍵和V類型的值。要編寫從地圖接受元素構造函數,聲明構造所以它是一個模板太:

template <typename Iter> 
hash_table(Iter first, Iter last) 
{ 
    init(); 
    for (Iter it = first; it != last; ++it) 
     this->operator[](it->first)=it->second; 
} 

它自動匹配,可以解除引用獲取firstsecond成員的任何迭代器。在標準容器中,包括mapmultimap及其​​表兄弟。這應該足以讓你開始。

另外請注意,當你需要一個你不知道如何拼寫的類型,比如一個複雜的函數指針或lambda(你根本無法拼寫)時,這是一個有用的技巧。

+0

謝謝!它現在有效! – perlik