使用STL迭代器的模板构造函数

时间:2013-04-17 16:03:12

标签: c++ templates constructor

我正在写一个哈希表,但我遇到了一个困难。我想用标准容器(矢量,列表等)的内容初始化它,如地图:
map <string,int> m(a.begin(),a.end())
我有以下类的定义:template <class key,class val,class hashik=std_hash> class hash_table
我定义了一个构造函数:

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

我做错了什么?有关模板的书籍可以建议我阅读吗?

1 个答案:

答案 0 :(得分: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和他们的unordered_堂兄弟。这应该足以让你开始。

另请注意,当您需要一种不知道如何拼写的类型时,这是一个很有用的技巧,例如复杂的函数指针或lambda(根本不能拼写)。