如何创建容器的模板(e.x. std :: map)?

时间:2011-03-17 08:16:13

标签: c++ templates stl containers

所以,我有一个简单的工作代码,例如

template <typename T, typename VALUE>
VALUE mapAt(T key)
{
    std::map<T, VALUE>::const_iterator item_i(MyMap.find(key))
                                      , end_i(MyMap.end());
    if (item_i == end_i)
    {
        throw std::exception("No such key!");
    }

    return (*item_i).second;
}

问题:是否可以在不使用std::map的情况下创建新的模板功能,但使用不同的容器(ex std::map,{{} 1}},...),像这样:

std::multimap

问题:当我想使用它时,例如:

template <class Container, typename T, typename VALUE>
VALUE mapAt(Container& MyMap, T key)
{
    Container<T, VALUE>::const_iterator item_i(MyMap.find(key))
                                       , end_i(MyMap.end());
    /* ... */
}

编译器给我一个错误:

  

main.cpp(119):错误C2664:'mapAt':   无法转换参数1   '的std ::地图&LT; _Kty,_Ty&GT;'至   “的std ::地图&LT; _Kty,泰 - &GT; ( _cdecl&amp;)'1&gt;
  用1> [1>   _Kty = int,1&gt; _Ty = char 1&gt; ] 1&gt;没有用户定义的转换   可执行的运营商   这种转换,或运营商   不能被称为

1 个答案:

答案 0 :(得分:2)

你可以这样写:

template <class Container>
typename Container::mapped_type mapAt(Container& MyMap, typename const Container::key_type& key)
{
    typename Container::const_iterator iter = MyMap.find(key);
    return iter->second;
}

int main()
{
    std::map<int, char> my_map;
    char ch = mapAt(my_map, 123); 
}
相关问题