博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL中map键值为struct时报错处理
阅读量:6330 次
发布时间:2019-06-22

本文共 1135 字,大约阅读时间需要 3 分钟。

hot3.png

最近在使用stl中的map容器时,碰到key为结构体的情况,总结如下,以便提醒自己。
我的使用情景是,我需要根据不同的比例尺、道路类型这两个参数获取到对应的道路宽度,由于我是使用map解决这个问题的,
自然而然的就以比例尺、道路类型这两个参数为key,道路宽度为value,建立的key如下:
1 
typedef 
struct
 tagRoadKey 
2 
{
3 
    
int
 nType;
4 
    
int
 nScale;
5 
    }
6 
}ROADKEY;
但是编译的时候,报了这个错误
d:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::multimap<_K,_Ty,_Pr,_A> &,const class std::multimap<_K,_Ty,_Pr,_A> &)' : could not deduce template argument for 'const
 class std::multimap<_K,_Ty,_Pr,_A> &' from 'const struct tagRoadKey'
说实话,当初不太明白这是什么错误,但从个人经验来判断,问题肯定出在这个key上面,后来google下,看到了别人写的文章,才知道原因,原来map中的key默认是以less<>升序对元素排序(排序准则也可以修改),也就是说key必须具备operator<对元素排序,而平常我们的用的基本上都是基本类型元素作为key,所以就不存在这个问题了,更详细的解释请看C++标准程序库一书,第六章,set容器章节。
改正后的结构体如下:
 1 
typedef 
struct
 tagRoadKey 
 2 
{
 3 
    
int
 nType;
 4 
    
int
 nScale;
 5 
 6 
    
bool
 
operator
 
<
(
const
 tagRoadKey
&
 other) 
const
 7 
    {
 8 
        
if
 (nType 
<
 other.nType)        
//
类型按升序排序
 9 
        {
10 
            
return
 
true
;
11 
        }
12 
        
else
 
if
 (nType 
==
 other.nType)  
//
如果类型相同,按比例尺升序排序
13 
        {
14 
            
return
 nScale 
<
 other.nScale;
15 
        }
16 
        
17 
        
return
 
false
;
18 
    }
19 
}ROADKEY;

转载于:https://my.oschina.net/JeremyOuyang/blog/152151

你可能感兴趣的文章
CentOS 6.5安全加固及性能优化_操作系统
查看>>
每天laravel-20160709|CallEvent
查看>>
我的友情链接
查看>>
【三石jQuery视频教程】02.创建 FontAwesome 复选框和单选框
查看>>
Cisco 配置DHCP中继 代理工程 实例
查看>>
Centos7.3部署KVM虚拟化环境
查看>>
configure: error: Cannot find ldap.h
查看>>
Linux启动分析(2)— bootsect.S、setup.S、head.S分析
查看>>
自学java时的笔记(一)
查看>>
Qt之文本编辑器(二)
查看>>
python编译时检查语法错误
查看>>
考题纠错2
查看>>
SQL——索引
查看>>
Python新手快速入门教程-基础语法
查看>>
JVM性能调优入门
查看>>
关于raid的基本原理、软raid的实现演示
查看>>
科技企业的幕后推手,人工智能究竟有何魔力
查看>>
详解Oracle临时表的几种用法及意义
查看>>
HTML(七)------ 表格
查看>>
如何成为一个设计师和程序员混合型人才
查看>>