НЕТ - никогда не делай этого!
Это невозможно, вы можете получить случайные сбои.
Единственный способ сделать это правильно - использовать переименование пространства имен: создать альтернативу
буст-версия помещена в другое пространство имен.
В последней версии BCP предусмотрена эта опция. Таким образом, вы будете использовать что-то вроде boost_1_43 вместо boost. Но это будет довольно прозрачно для вас. Но вы все равно должны знать
из этого вы не можете использовать две версии boost в одном файле cpp.
Также посмотрите на это обсуждение: Создание библиотеки с обратно совместимым ABI, использующим Boost
Любимый скрипт переименовывает пространство имен, определяет и включает в себя, так что вы можете включить два
версии boost как
#include <boost/foo.hpp>
#include <myboost/bar.hpp>
boost::foo f;
myboost::bar b;
Повышение ППГ не позволяет этого.
Но все же вы должны быть осторожны, так как некоторые библиотеки экспортируют внешние символы "C" без
префикс boost, boost :: thread и boost :: regex, C API (regexec, regcomp)
Редактировать
В качестве примера такой проблемы создайте следующие файлы:
a.cpp:
template<typename Foo>
Foo add(Foo a, Foo b)
{
return a+b;
}
int foo(int x,int y)
{
return add(x,y);
}
b.cpp:
template<typename Foo>
Foo add(Foo a, Foo b)
{
return a-b;
}
int bar(int x,int y)
{
return add(x,y);
}
test.cpp:
#include <iostream>
int foo(int,int);
int bar(int,int);
int main()
{
std::cout<< foo(10,20) <<" " <<bar(10,20) << std::endl;
}
Скомпилируйте их:
g++ a.cpp b.cpp test.cpp
Вы ожидаете:
30 -10
Но вы получите
30 30
или
-10 -10
В зависимости от порядка связывания.
Таким образом, используя две версии буста, вы можете случайно использовать символы других бустов и сбоев
так же, как в этой программе символ int add<int>(int,int)
преобразуется в тот же символ даже
если он размещен в разных единицах компиляции.