用 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
}
[解决办法]
散分贴吗?接分 >_<
[解决办法]
[解决办法]
boost 只知道一点 帮顶了
[解决办法]
看了半天还是不懂,唉,只能up了
[解决办法]
我有点问题:
1. 我姑且理解为“有boost的时使用boost一套类型,否则定义自己的类型”
全局定义的和boost的是否一样?不一样就可能造成冲突,对于使用了boost的.cpp使用了boost的一套类型,而对于没有使用boost的.cpp文件使用了自己定义的一套类型,由于这两套类型不一定一样,所以本身就会造成歧义
2. 我觉得像uint32_t这种很热门的公用类型名不应该随意使用,尤其不应该在.cpp里定义,应该用一个.h统一定义
[解决办法]
mark
[解决办法]
出现名字冲突,你需要使用哪一个,加上名字空间前缀就可以了。