많은 공유 라이브러리에 걸쳐 상당히 큰 크기의 프로젝트를 진행하고 있습니다. 또한 STL, Boost 및 자체 템플릿 클래스 및 함수에 크게 의존합니다. 많은 내 보낸 클래스에는 템플리트 구성원이 있으며 내 보낸 함수에는 템플리트 매개 변수가 있습니다. 내가 비주얼 스튜디오 (2008 년과 2010 년 모두)에서 컴파일 할 때공유 객체/DLL에서 템플릿 클래스 및 함수 사용
#if defined(_MSC_VER) && defined(_DLL)
// Microsoft
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#elif defined(_GCC)
// GCC
#define EXPORT __attribute__((visibility("default")))
#define IMPORT
#else
// do nothing and hope for the best at link time
#define EXPORT
#define IMPORT
#endif
#ifdef _CORE_COMPILATION
#define PUBLIC_CORE EXPORT
#define EXTERNAL_CORE
#else
#define PUBLIC_CORE IMPORT
#define EXTERNAL_CORE extern
#endif
#include <deque>
// force exporting of templates
EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>;
EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >;
class PUBLIC_CORE MyObject
{
private:
std::deque<int> m_deque;
};
SO, 내 문제는, 나는 다음과 같은 얻을 : 여기
내가 라이브러리 수출을 어떻게의 제거 다운 예입니다 경고 :경고 C4251 : '표준 : _ Deque_val < _Ty, _Alloc> :: _ Almap' : 클래스 '표준 : : 할당 < _Ty>' 에 DLL-간이 필요 얼굴은 클래스 의 고객의 표준 : _ Deque_val < _Ty, _Alloc> '내가이
std::allocator<int>
를 수출하지 않았 음을 의미하는 것으로 보인다
사용할 수 있습니다. 클래스의 표준 : 양단 큐 < _Ty> ':
경고 C4251 :'을 MyObject : m_deque '그리고 내 수출이
EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>; EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >;
을 포함하지 않는 때문에 잘못된 것 아니에요 경고를 산출 클래스의 클라이언트가 사용하는 DLL 인터페이스를 가질 필요 '을 MyObject'
내가 생각할 수있는 유일한 방법입니다 _Ty
일에 대한 경고가 e std::allocator
은 어쨌든 int
이 아니지만, std::deque<int>
이 std::allocator<int>
으로 논리적으로 할당되기 때문에 별다른 표시가없는 것 같습니다.
소비하는 응용 프로그램은 클래스를 잘 사용할 수 있지만이 경고를 무시해서는 안된다고 생각합니다. 리눅스에서 g ++로 컴파일 할 때 오류는 발생하지 않습니다 (그렇다고해서 제대로 작동하는 것은 아닙니다). g ++가 자동으로 MSVC가 할 수없는 일을하고 있습니까? 저는 Linux에서 GCC, Windows에서 OSX 및 MSVC에 LLVM을 타겟팅하고 있었지만 잠재적으로 Windows 개발을 위해 MinGW로 이동할 수 있으므로 MSVC를 포기하는 것이 문제가되지는 않습니다 (이 점이 너무 큰 불편 함을 입증하는 경우) .
_ 그 경고를 보완 해 주셔서 감사합니다. – xtofl
이 항목은 http://stackoverflow.com/q/5661738/417197과 중복 되었습니까 (또는 이와 유사합니까?)? –