LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 863|回复: 4

关于kylix3下std::map使用问题的探讨

[复制链接]
发表于 2003-6-26 20:07:42 | 显示全部楼层 |阅读模式
在做程序从VC6到kylix3移植的过程中,发现有类似以下代码不能通过编译:
map<int, int> mapTemp;
mapTemp.insert(make_pair(0, 0));
提示错误:
Can't find a match for 'map<int, int, less<int>, allocator<pair<const int, int> > >::insert(pair<int, int>)'
而如果 mapTemp[0] = 0;就没有问题。
经过研究发现是make_pair()的返回类型和insert的参数类型不匹配导致。make_pair()返回的是pair<int, int>类型,而insert()要求的是pair<const int, int>类型。
怎么办呢?有三个选择:
1。只使用重载的[]操作,不过这样子心里有些不爽
2。对于需要使用的数据类型,做出make_pair的特例化实现,这样子使用的数据类型一多的话就很繁琐
3。修改make_pair的缺省实现,这样子有可能有副作用,也许会对其他代码造成影响。
最后我选择了3,反正不行再改回来把。
打开kylix3安装目录下的/include/stlport/stl/_pair.h文件,跳到122行。把以下代码
template <class _T1, class _T2>
inline pair<_T1, _T2> __STL_CALL make_pair(const _T1& __x, const _T2& __y)
{
    return pair<_T1, _T2>(__x, __y);
}
修改为:
template <class _T1, class _T2>
inline pair<const _T1, _T2> __STL_CALL make_pair(const _T1& __x, const _T2& __y)
{
    return pair<const _T1, _T2>(__x, __y);
}
重新编译,搞定。
发表于 2003-6-26 20:19:01 | 显示全部楼层
不错,有启发。
 楼主| 发表于 2003-6-26 20:44:23 | 显示全部楼层
把问题简化一下,就是以下代码的问题:
        pair<const int, int> p1 = pair<int, int>(0, 0);
        pair<int, int> p2 = pair<const int, int>(0, 0);
编译结果:
BCB5.0 两句都编译通过
gcc3.2 两句都编译通过
vc6.0  两句都编译通过
kylix3 两句都编译不通过
结论就是kylix3的编译器比较特殊,或者需要加上某个未知的编译选项?
发表于 2003-6-26 23:43:12 | 显示全部楼层
这也不是很好的办法
因为移植性不好
不用说移植到其它平台了
就是把代码拿到其它电脑上也要自己修改对应平台上头文件

另外int 和const int 对参数来说没有区别
因为不是const引用
所以都可以用

我觉得可能是其它方面原因
发表于 2003-6-27 07:13:25 | 显示全部楼层
是不是少了什么配套的头文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表