首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

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

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

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


问题:

一个cpp代码

C/C++ code
#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 那个头文件中最后会包含这样的代码:

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



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

C/C++ code
#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




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



[解决办法]
我觉得较好的方法是自己定义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
}

[解决办法]
散分贴吗?接分 >_<
[解决办法]
探讨
我不是很明白,即然stdint.h及boost中都已定义了uint32_t;
你自己为何还要定义uint32_t;
另外:我用vs2005+boost1.33测试没有问题


[解决办法]
boost 只知道一点 帮顶了
[解决办法]
看了半天还是不懂,唉,只能up了

[解决办法]
我有点问题:
1. 我姑且理解为“有boost的时使用boost一套类型,否则定义自己的类型”
全局定义的和boost的是否一样?不一样就可能造成冲突,对于使用了boost的.cpp使用了boost的一套类型,而对于没有使用boost的.cpp文件使用了自己定义的一套类型,由于这两套类型不一定一样,所以本身就会造成歧义
2. 我觉得像uint32_t这种很热门的公用类型名不应该随意使用,尤其不应该在.cpp里定义,应该用一个.h统一定义
[解决办法]
mark
[解决办法]
出现名字冲突,你需要使用哪一个,加上名字空间前缀就可以了。

热点排行