아니요 - 절대하지 마세요!
뜻하지 않은 충돌이 발생할 가능성이 있습니다.
이름 공간 이름 바꾸기를 사용하는 것이 유일한 방법은 부스트 버전을 다른 네임 스페이스에 배치하는 것입니다.
최신 버전의 BCP가이 옵션을 제공합니다. 따라서 boost 대신 boost_1_43과 같은 것을 사용할 것입니다. 그러나 그것은 당신을 위해 아주 투명 할 것입니다. 그러나 당신은 아직도 에 대해 동일한 cpp 파일에서 두 가지 버전의 boost를 사용할 수 없다는 것을 알고 있어야합니다.
또한이 토론에 살펴 : Creating Library with backward compatible ABI that uses Boost
좋아 스크립트, 네임 스페이스의 이름을 변경 정의하고 실제로
#include <boost/foo.hpp>
#include <myboost/bar.hpp>
boost::foo f;
myboost::bar b;
부스트 BCP이 허용하지 않습니다
같은 부스트 두 버전을 포함 할 수 있도록 포함 .
그러나 일부 라이브러리는 부스트 접두사없이 :: 스레드를 높이고 부스트 : 정규식의 C API를 (regexec는, regcomp에를) 통근 "C"문자 수출로 여전히주의해야합니다
편집
같은 문제의 예를 들어 다음과 같은 파일을 만듭니다
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);
}
시험.CPP :
30 -10
하지만 당신은
30 30
또는
,691를 얻을 수 있습니다 :
이
g++ a.cpp b.cpp test.cpp
당신은 기대 :
#include <iostream>
int foo(int,int);
int bar(int,int);
int main()
{
std::cout<< foo(10,20) <<" " <<bar(10,20) << std::endl;
}
을 컴파일
-10 -10
연결 순서에 따라 다릅니다. 그것은 서로 다른 컴파일 단위에 배치되는 경우
그래서 당신이 실수로 다른 부스트에서 기호를 사용하여이 프로그램 기호
int add<int>(int,int)
와 동일한 충돌 할 수있는 두 가지 부스트 버전을 사용하는 동일한 기호에도 에 해결됩니다.
답장의 처음 부분에 동의하지 않더라도 +1 링크입니다. – richj
@richj - 모든 연결이 명시적인 DLL 플랫폼에서는 가능하지만 ELF에 대해서는 나쁜 결과가 발생합니다 (경험에서) – Artyom