다른 질문에서 언급했듯이 나는 this article을 발견했습니다. MSVC7.1을 통해 1.40으로 부스트를 컴파일하고 몇 가지 C4251 경고가 나타 났을 때 문제가 발생했습니다.템플릿 코드 내보내기 = 위험합니까? (MSVC)
이제 기사를 읽은 후 다음과 같은 질문을 던집니다. 템플릿 코드를 내보내는 것이 일반적으로 바람직하지 않습니까?
class DLLEXPORT_MACRO AClass
{
public:
std::vector<int> getVecCopy() { return myVec; }
...
}
이 코드는 MSVC7.1을 통해 DLL로 컴파일됩니다. 이 코드는 다른 MSVC7.1 코드에서 참조 할 때 오류를 생성하지 않지만 MSVC8 코드에서이 DLL을 참조하면 (메모리 정렬 문제가 발생합니까?)시 이 충돌합니다.
분명히 나쁘기 때문에 ... 템플릿 코드를 내보내는 문제에 대처하는 "모범 사례"는 무엇입니까?
이것은 일반적인 C++ ABI 문제의 한 부분으로 악명 높은 "취약한 기본 클래스"문제는 또 다른 특수한 경우입니다. DLL에서 템플릿 인터페이스를 내보내는 일은 기다리고있는 재앙 일뿐입니다. 내가 선호하는 솔루션은 MSalters '0의 변형입니다. DLL에서 직접 C++을 내보내고, C 바인딩이있는 얇은 내보내기 레이어를 제공하고, 개체 포인터가 불투명 한 핸들처럼 클라이언트에 앞뒤로 전달됩니다. 그런 식으로 클라이언트는 컴파일러 관련 개체 내부에서 직접 원숭이를 처리 할 수 없으므로이 문제가 발생하지 않습니다. –
통찰력에 감사드립니다. (1)은 고려되지 않지만 Bob이 말했듯이 (0) 또는 (0 ')으로 살 수 있다고 생각합니다. 사실, 왜 boost :: program_options가 "일어날 대기 재앙"을 만들고 있는지 궁금합니다. – msi