用 boost::Serialization 时出现名字冲突. 多谢 SammyLan 帮忙找出问题所在. 求解决办法.

cunsh 2008-09-06 09:41:03
用 boost::Serialization 时出现名字冲突.

多谢 SammyLan 帮忙找出问题所在.

各位老师看看有什么好的解决办法.


问题:

一个cpp代码



#include <boost/archive/text_iarchive.hpp>

typedef int uint32_t;

void f()
{
boost::uint32_t x; //ok
::uint32_t y; //ok
uint32_t z; //error C2872: "uint32_t" 不明确的符号
}




编译时报错: error C2872: "uint32_t" 不明确的符号


就是说包含 text_iarchive.hpp 时 . 自动将 boost::uint32_t 引入全局名字空间.
而我们自己的代码也在全局名字空间定义了这个 uint32_t . 出现名字冲突.


现在 SammyLan 老师找到问题出在 boost 那个头文件中最后会包含这样的代码:



#if !BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x560) )
using namespace boost;
#endif




现在问题是怎么修改. 我不想修改 boost 库的代码. 而把自己代码修改为:



#if XXXXXX //如果存在 "boost\cstdint.hpp" 文件. include 之. ------------------------------>这个怎么写?
#include "boost\cstdint.hpp" //定义 boost::uint8_t 的文件.
#endif


#ifdef BOOST_CSTDINT_HPP // boost\cstdint.hpp 头文件的宏
using boost::int8_t;
using boost::uint8_t;
.....
#else
typedef signed char int8_t;
.....
#endif






请教上面那个宏该怎么写. 或者其它的解决办法.

...全文
202 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
金庆 2008-09-11
  • 打赏
  • 举报
回复
奇怪,using 也只是引入到 boost_132 名字空间中了,应该不会出问题的。

cunsh 2008-09-11
  • 打赏
  • 举报
回复
回复 jq0123:

boost1.35 + vs2005 确确实实是有这个问题.
还有. 谢谢你们对boost文档的翻译~
cunsh 2008-09-09
  • 打赏
  • 举报
回复
回复 simulationz:

用的地方太多 加不过来哇
simulationz 2008-09-08
  • 打赏
  • 举报
回复
出现名字冲突,你需要使用哪一个,加上名字空间前缀就可以了。
luxiaoxun 2008-09-07
  • 打赏
  • 举报
回复
boost 只知道一点 帮顶了
lin_style 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keiy 的回复:]
我不是很明白,即然stdint.h及boost中都已定义了uint32_t;
你自己为何还要定义uint32_t;
另外:我用vs2005+boost1.33测试没有问题

[/Quote]

两者uint32_t不一样?


自去年见到村少找工作

好久不见村少。。
我啃 2008-09-07
  • 打赏
  • 举报
回复
下面经供参考我手头没有编译器也没有boost:
写my_type_ground.h进行封装
#ifndef MY_TG_H_
#define MY_TG_H_

#ifdef BOOST_CSTDINT_HPP // boost\cstdint.hpp 头文件的宏
using boost::int8_t;
....
#else
typedef signed char int8_t;
...
#endif

#endif MY_TG_H_
使用:in 1.cpp
#include <boost/archive/text_iarchive.hpp>
// text_iarchive.hpp引入cstdint.hpp 从而造成my_type_ground使用boost一套类型,如果之前没有引入则使用自行定义一套
#include "my_type_ground.h"
jieao111 2008-09-07
  • 打赏
  • 举报
回复
mark
我啃 2008-09-07
  • 打赏
  • 举报
回复
我有点问题:
1. 我姑且理解为“有boost的时使用boost一套类型,否则定义自己的类型”
全局定义的和boost的是否一样?不一样就可能造成冲突,对于使用了boost的.cpp使用了boost的一套类型,而对于没有使用boost的.cpp文件使用了自己定义的一套类型,由于这两套类型不一定一样,所以本身就会造成歧义
2. 我觉得像uint32_t这种很热门的公用类型名不应该随意使用,尤其不应该在.cpp里定义,应该用一个.h统一定义
wangdeqie 2008-09-07
  • 打赏
  • 举报
回复
看了半天还是不懂,唉,只能up了
cunsh 2008-09-07
  • 打赏
  • 举报
回复
回复 lin_style: 现在整天做事. 来不及接分了啊. 哈哈~
cunsh 2008-09-07
  • 打赏
  • 举报
回复
回复 lin_style:

那两个定义是一样的. 就是一个在全局名字空间一个在boost::名字空间.



回复 <八音盒>:

我们的 uint32_t 等就是定义在.h中的. 照你上面那样修改了后. 这个问题解决了.
但问题还不只那一处. 还有 CRITICAL_SECTION 这个名字也冲突. 唉~~~


所以我又试着修改boost的代码.

\boost\serialization\detail\shared_ptr132.hpp
\boost\serialization\detail\shared_count_132.hpp

就是这两个文件. 修改如下:



namespace boost_132 { //按道理下边的 using 也只是引入到 boost_132 名字空间中了. 但就是不明白怎么跑到全局名字空间去了.

#if !BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x560) )
//using namespace boost; //注释这行.
#endif




namespace detail{
#if !BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x564) )
//using namespace boost::detail; //注释这行.
#endif

class sp_counted_base
{
//private:

#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x564) )
typedef boost::detail::lightweight_mutex mutex_type; //加boost::
#else
typedef boost::detail::lightweight_mutex mutex_type; //加boost::
#endif



然后我们自己那块代码就不动了. 编译运行也没什么错误. 貌似只能这样了?
cunsh 2008-09-06
  • 打赏
  • 举报
回复
回复 keiy :
那个不是我定义的...


回复 星羽:
就当散分了~
星羽 2008-09-06
  • 打赏
  • 举报
回复
散分贴吗?接分 >_<
柯本 2008-09-06
  • 打赏
  • 举报
回复
我不是很明白,即然stdint.h及boost中都已定义了uint32_t;
你自己为何还要定义uint32_t;
另外:我用vs2005+boost1.33测试没有问题
cunsh 2008-09-06
  • 打赏
  • 举报
回复
回复 keiy
主要是用到 uint32_t int8_t 等的地方太多了. 就是用它代替内置的 unsigned int, char 等的. 不能每次都加 myspace:: 啊.
柯本 2008-09-06
  • 打赏
  • 举报
回复
我觉得较好的方法是自己定义namespace
#include <boost/archive/text_iarchive.hpp>
namespace myspace
{
typedef int uint32_t;
}

void f()
{
boost::uint32_t x; //ok
::uint32_t y; //ok
myspace::uint32_t z; //OK
}
cunsh 2008-09-06
  • 打赏
  • 举报
回复

我的 boost 库 1.35 版. 编译器 vs2005.
在 boost1.36版 + vs2003 中测试也存在同样问题.

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧