2012-06-17 3 views
0

DLL에서 템플릿 변수를 __declspec (dllexport)를해야합니다 나는과 같이 내가 (null로) 멤버 변수를 초기화해야하는 템플릿 클래스를 가지고

template <typename T> 
T * Singleton<T>::m_pInstance = NULL; 

내가에이를 넣어 클래스 선언의 끝 (헤더 파일에 있음). 이 올바른 위치를 cpp 파일에 있지만 클래스가 작고 인라인 함수 만 포함되어 있습니다.

이것은 헤더 파일이 솔루션의 일부인 일반 프로그램에서 올바르게 작동합니다. 하지만 이제 클래스에 DLL을 추가하고 DLL에서이를 내 보내려합니다.

DLL에서이 변수를 내보낼 수 있도록이 초기화에 __declspec (dllexport)을 넣을 수있는 곳은 무엇입니까?

내가 읽은 문서는 다음과 같이 올바른 방법이라고 말한다 :

// ENGINEPART_API is defined as __declspec(dllexport) 
template <typename T> ENGINEPART_API 
T * Singleton<T>::m_pInstance = NULL; 

DLL이 잘 구축,하지만 난 내 프로그램에 클래스를 가져하려고 할 때 내가 얻을 :

1>singleton.h(52): error C2720: 'Singleton<T>::m_pInstance' : '__declspec(dllimport)' storage-class specifier illegal on members 

업데이트

슈퍼맨 내가 DLL에서 템플릿을 내보낼 수 없습니다 것을 알려줍니다. 음, 해당 템플릿을 사용하는 DLL에서 클래스를 내보낼 수 있으므로 템플릿이 DLL에있는 이유입니다. 이 멤버 변수 (정적)를 초기화하는 방법이 필요합니다.

클래스 선언은 다음과 같다 : 나는 템플릿을 사용하는 DLL에서 클래스를 내보낼 수 있습니다

template <typename T> 
class ENGINEPART_API Singleton 
{ 
private: 
    static T *m_pInstance; 
    // ... inline functions 
}; 

: 당신은 템플릿을 내보낼 수 없습니다

class ENGINEPART_API blah : public Singleton <blah> 
{...}; 
+1

"템플릿 클래스"가 아니라 "클래스 템플릿"이 있습니다. 그것은 모든 차이를 만듭니다. 템플릿 만 내보낼 수 있으며 클래스 만 사용할 수 있습니다. –

답변

2

. 클래스의 인스턴스는 클래스가 실제로 사용될 때만 생성되며 컴파일러는 클래스 템플릿의 전체 소스에 액세스해야합니다. C++ 표준에서는 클래스 템플릿을 내보내는 데 사용할 수있는 내보내기 키워드에 대해 설명하지만 AFAIK에는이를 구현하는 컴파일러가 하나만 있습니다. 따라서 할 수있는 가장 좋은 방법은 전체 템플릿 클래스 정의를 헤더 파일에 포함시키는 것입니다.

+0

안녕 슈퍼맨, 귀하의 회신에 감사드립니다. 헤더 파일에 전체 템플릿 클래스 정의가 있습니다. 몇 가지 기능 만 있고 인라인됩니다. 필요한 경우 여기에서 재현 할 수 있습니다. 문제는 클래스의 하나 (정적) 멤버 변수를 null로 초기화하려고 시도하는 것입니다. – fishfood

관련 문제