/////////////////////////////////////////////////////////////////////////////
//===========================================================================
template<typename T>
class Singleton : public T
{
protected:
 Singleton();

public:
 static Singleton<T>& Instance(void);
};

//===========================================================================
template<typename T>
Singleton<T>::Singleton ()
{
}

template<typename T>
Singleton<T>& Singleton<T>::Instance(void)
{
 static Singleton<T> single_instance;

 return single_instance;
}

/////////////////////////////////////////////////////////////////////////////
//===========================================================================
class TestTaskData
{
...
};

/////////////////////////////////////////////////////////////////////////////
//===========================================================================
template class Singleton<TestTaskData>;

명시적으로 템플릿 클래스의 오브젝트 코드를 생성하기 위해서는(Explicit template instantiation)
위의 코드를 cpp에 추가 하면 해당 cpp의 오브젝트 파일에 생성된다.

참고사항> 
#  gcc에서 컴파일 옵션 template instantiation 
   -fimplicit-templates : 묵시적 템플릿 인스턴티에이션을 사용 (템플릿 클래스의 인라인화)
   -fno-implicit-templates : 묵시적 템플릿 인스턴티에이션을 사용 안함
   -frepo : rpo 파일을 통해서 템플릿 인스턴스 db를 생성해서 자동으로 처리

여담>
1. STL 쓰면서 -fno-implicit-templates 옵션 사용하면 죽음이다.
2. msvc++ 생각보다 똑똑한 녀석이었다. ~_~;
3. #pragma interface 와 implementation 살펴보자.

Posted by 셈말짓기 :