我希望同时将两个版本的 BOOST 编译到一个项目中。理想情况下,它们应该可以按照以下方式使用:
boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);
最佳答案
我阅读(仔细扫描)了 development list discussion .没有简单的解决办法。总结:
在命名空间声明中包装头文件
namespace boost_1_36_0 { #include <boost_1_36_0/boost/regex.hpp> } namespace boost_1_35_0 { #include <boost_1_35_0/boost/shared_ptr.hpp> }
- 需要修改源文件
- 不允许将两个版本包含在同一个翻译单元中,因为宏不尊重 namespace 。
在包含标题之前定义 boost
#define boost boost_1_36_0 #include <boost_1_36_0/boost/regex.hpp> #undef boost #define boost boost_1_35_0 #include <boost_1_35_0/boost/shared_ptr.hpp> #undef boost
- 源文件可以简单地用
-Dboost=boost_1_36_0
编译 - 仍然没有解决单个翻译单元中的宏冲突。
一些内部头文件包含可能会搞砸,因为这种事情确实会发生。
#if defined(SOME_CONDITION) # define HEADER <boost/some/header.hpp> #else # define HEADER <boost/some/other/header.hpp> #endif
但解决这些情况可能很容易。
- 源文件可以简单地用
- 修改整个 boost 库以将
namespace boost {..}
替换为namespace boost_1_36_0 {...}
,然后提供命名空间别名。将所有BOOST_XYZ
宏及其用法替换为BOOST_1_36_0_XYZ
宏。- 如果您愿意付出努力,这可能会奏效。
关于c++ - 如何将 BOOST 包装在单独的命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/122782/