如何创建容器模板(例如 std::map)?
所以,我有一个简单的工作代码,例如
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
的情况下创建一个新的模板函数,但使用不同的容器(例如 std::map
、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());
/* ... */
}
问题:当我我尝试使用它,例如:
std::map<int, char> my_map;
char ch = mapAt<std::map<int, char>(), int, char>(my_map, 123); // C2664 error
编译器给了我一个错误:
main.cpp(119) : 错误 C2664: 'mapAt' : 无法将参数 1 转换为 'std::map<_Kty,_Ty>'到 'std::map<_Kty,Ty>; (_cdecl &)' 1>
与 1> [ 1>
_Kty=int, 1> _Ty=字符1> ]1>没有用户定义的转换 可用的操作员可以执行 此转换或运算符 无法调用
So, I had a simple working code, for example
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;
}
Question: is it possible to create a new template function without using std::map
, but using different containers (e.x. std::map
, std::multimap
, ...), something like this:
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());
/* ... */
}
Problem: when i'm tring to use it, like:
std::map<int, char> my_map;
char ch = mapAt<std::map<int, char>(), int, char>(my_map, 123); // C2664 error
compiler gaves me an error:
main.cpp(119) : error C2664: 'mapAt' :
cannot convert parameter 1 from
'std::map<_Kty,_Ty>' to
'std::map<_Kty,Ty> (_cdecl &)' 1>
with 1> [ 1>
_Kty=int, 1> _Ty=char 1> ] 1> No user-defined-conversion
operator available that can perform
this conversion, or the operator
cannot be called
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你可以这样写:
You can write something like this: