2012-12-04 2 views
2

다른 C++ 프로젝트에서 일반적으로 사용되는 C++ 클래스 라이브러리 프로젝트가 있습니다. 내 클래스 라이브러리 프로젝트 내부 클래스를 사용할 수 있도록하기 위해, 나는 내 클래스 라이브러리 프로젝트 내에서 템플릿 클래스를 생성 할 때까지클래스 라이브러리 프로젝트에서 템플릿 클래스 만들기 C++

#pragma once 
#ifdef MYLIB 
# define MYLIB_EXPORT __declspec(dllexport) 
#else 
# define MYLIB_EXPORT __declspec(dllimport) 
#endif 

문제 없음 아래의 예와 같은 헤더 파일을 썼다. 문제는 내 템플릿 클래스를 내보낼 수 없다는 것입니다.

나는 "허용되지 같이 DllImport 함수의 정의"를 말하는 compilaton 오류를 얻고있다이 경우에서 MyClass.h

template<class T> 
class MYLIB_EXPORT MyClass 
{ 
    void myMethod(); 
    // ... 
} 

template<class T> 
void MyClass::myMethod() 
{ 
    // ... 
} 

. 나는 그 문제를 일으키는 원인을 안다. 나는 그것을 이해한다. 내 클래스 라이브러리 프로젝트를 사용하는 다른 프로젝트는 MYLIB_EXPORT 키워드를 __declspec (dllimport)로 변환합니다. 따라서 MyClass의 메소드가 DLL에 정의 될 것으로 기대하고 있습니다. 그러나 컴파일러는 헤더 안에 정의를 봅니다.

이 상황을 어떻게 극복하고 내 클래스 라이브러리 프로젝트 내에 정의 된 템플릿 클래스를 내보낼 수 있습니까?

답변

4

인스턴스가 생성되지 않은 템플릿은 코드 생성기이므로 실제로 인스턴스화 될 때만 이진 명령어로 변환됩니다. 이런 이유로 "일반"함수/클래스 인 것처럼 템플릿을 "바이너리 형식"으로 내보낼 수 없습니다. (다른 한편으로는 적어도 이론적으로 템플릿의 인스턴스화를 내보낼 수 있습니다.)

간단히 말하면 라이브러리 클라이언트가 포함 할 헤더에 템플릿 만 남겨 두십시오.

이 이유는 템플릿을 헤더에 유지하고 파일을 .cpp 개로 분리하지 않는 이유입니다.

0

템플릿 클래스에서 MYLIB_EXPORT 문을 제거하기 만하면됩니다. 그런 다음 클래스 외부에서 클래스 함수를 정의 할 수 있습니다 (단, *.h 또는 *.hpp 헤더 파일에 있음).

에서 MyClass.h

template <typename T> 
    class MyClass // MYLIB_EXPORT removed 
    { 
     void myMethod(); 
     // ... 
    }; 

    template <typename T> 
    void MyClass<T>::myMethod() 
    { 
     // ... 
    } 

나는이 문제를 얻었다. 오랜 시간이 지난 후에 MYLIB_EXPORT를 제거하면 해결할 수 있습니다. 이 답변을 통해 다른 사용자에게 시간을 절약 할 수 있기를 바랍니다.

관련 문제