2012-06-12 2 views
3

특정 유형 매개 변수 만 허용하는 템플릿 클래스()를 만들고 싶습니다 (단 doublefloat). 일반적으로 템플릿은 사용자 코드에서 어떻게 인스턴스화 될지 알 수 없으므로 헤더 파일 (.h)에 구현됩니다. 이 경우,과 같이 구현 파일 (.cpp)의 클래스를 구현하는 것이 더 의미가 있습니다 :C++에서 인스턴스화 된 템플릿 클래스의 헤더를 작성하려면 어떻게해야합니까?

// Foo.cpp: 

template <class T> 
class Foo 
{ 
    // Insert members here 
}; 

typedef Foo<double> Foo_d; 
typedef Foo<float> Foo_f; 

이 인스턴스화 foo.cpp에 컴파일 할 때 클래스를 컴파일합니다. 그렇다면 Foo_dFoo_f에 대한 별도의 선언을 작성하지 않고 헤더 파일에이 선언을하는 방법은 무엇입니까?

+0

이 질문에 대답하지 않지만 C++ 소스 파일의 이름을'.c' 확장자로 지정하는 것은 바람직하지 않습니다. –

+0

가능성이있는 복제본 : http://stackoverflow.com/questions/874298/c-templates-that-accept-only-certain-types이 질문은 특정 유형의 입력 만 허용하는 방법을 보여줍니다. 사용자가 직접 선언해야합니다. 사용자가 허용하는 것 이외의 다른 것을 시도하면 오류가 발생합니다. – tpg2114

+0

@Michael 그 말은 바보 같은 실수였습니다. – Matt

답변

5

헤더 파일에서 템플릿을 정의하고 메서드를 선언 할 수는 있지만 정의하지는 않습니다. 예를 들어 :

template <typename T> 
class Foo { 
    T val; 
public: 
    Foo (T t); 
    T value(); 
}; 

typedef Foo<double> Foo_d; 
typedef Foo<float> Foo_f; 

.cpp 파일에서, 당신은 방법의 구현을 완료 한 다음 원하는 템플릿을 인스턴스화합니다.

#include "foo_template.hpp" 

template <typename T> 
Foo<T>::Foo (T t) : val(t) {} 

template <typename T> 
T Foo<T>::value() { return val; } 

template class Foo<double>; 
template class Foo<float>; 

오브젝트 파일은 명시 적 인스턴스화 템플릿 Foo에서 Foo_dFoo_f에 대한 인스턴스 생성이 있어야합니다. 템플릿 Foo에 사용 된 다른 모든 유형은 인스턴스화가 없으므로 연결 오류가 발생합니다. 또는 컴파일러는 평소처럼 필요에 따라 인스턴스화를 작성하지만 클래스의 메소드에 해당하는 심볼을 해석 할 수 없습니다. 명시적인 인스턴스화가 존재하지 않기 때문입니다.

4

내가 잘못 이해하지 않는 한, 당신이 묘사 한 것은 새로운 C++ 11 extern template 기능의 사용 사례입니다. 이 기능을 사용하려면 템플릿 클래스의 인터페이스를 헤더 파일에 넣습니다. 그런 다음이 라인 헤더 파일을 끝낼 것 :

extern template class Foo<float>; 
extern template class Foo<double>; 

이 그것을 사용하는 경우 템플릿을 인스턴스화하려고하지 헤더 파일을 포함하는 파일을 알려줍니다. 그런 다음 C의 ++ 파일에, 당신은 그래서 당신은하지 않습니다,

template class Foo<float>; 
template class Foo<double>; 

이 마지막 두 줄이 번역 단위에서 템플릿을 인스턴스화하는 컴파일러를 강제 라인으로 끝나는 것이 다음 템플릿 클래스를 구현하고 것 링커 오류가 발생합니다.

희망이 도움이됩니다.

+0

고마워,하지만 어쨌든'C++ 11 '없이 이것을 할 수 있을까? – Matt

+1

@ Matt- 이것은 (지금은 비추천)'export' 키워드가해야만했던 것입니다. 이 정확한 문제는 'extern template'이 처음 도입 된 이유 중 하나이며, 해결 방법이 있다고 생각하지 않습니다. – templatetypedef

+0

오. 그 내용을 답에 추가해야합니다. – Matt

관련 문제