2016-10-12 22 views
1

라이브러리를 내 클래스 디자인에 래핑합니다. 내 클래스 생성자에서 라이브러리에 제공된 unsigned int 유형이 아닌 매개 변수를 사용하여 템플릿 메서드를 호출하고 싶습니다.비 형식 템플릿 인수 소스 파일의 명시 적 인스턴스화

#include <iostream> 
#include <bar.h> // template header in here 
class foo { 
    foo(unsigned num) { 
     BAR<num>(); // a template method BAR inside "bar.h" 
    } 
}; 

내가 이걸 가지고 놀려고 할 때, non-type 매개 변수가 constexpr 인 것처럼 보입니다. 따라서 위의 코드는 함수 호출 내에 const 에러가 있음을 나타내는 에러를 발생시킵니다.

그래서 foo 클래스를 클래스 템플릿으로 만들고이 unsigned non-type 매개 변수를 foo의 템플릿 인수 매개 변수에 전달하기로했습니다.

#include <iostream> 
#include <bar.h> // template header in here 
template <unsigned num> 
class foo { 
    foo() { 
     BAR<num>(); // a template method BAR inside "bar.h" 
    } 
}; 

이것은 잘 작동하는 것 같습니다. 그러나 헤더 파일과 소스 파일을 별도의 .hpp/.cpp 파일로 분리하고 싶습니다. this thread에 따르면 .cpp 소스 파일 안에 템플릿 구현을 배치하려면 .cpp 파일의 끝에 가능한 모든 템플릿 인수를 명시 적으로 인스턴스화해야합니다. 부호없는 정수와 같은 유형이 아닌 매개 변수의 경우, 서명되지 않은 모든 숫자 객체에 템플릿을 사용할 수있게하려면 수천 개의 가능한 부호없는 정수를 인스턴스화해야합니다. 도와 주셔서 감사합니다.

답변

0

템플릿 클래스의 구현을 소스 파일로 분리하는 것을 권장하지 않습니다. 귀하의 상황을 정확하게 이해한다면 템플릿 매개 변수의 가능한 모든 값을 인스턴스화하지 않으면 불가능하다고 생각합니다. unsigned은 불가능합니다.

+0

템플릿 인자로 non-type을 사용하고 싶다면 어쨌든 템플릿 구현을 노출해야한다는 의미입니까? – yc2986

+0

예. 그렇습니다. – grigor

+0

아직 구현을 분리하고 싶습니다. 이 경우 constructor에 매개 변수로 constexpr을 전달할 수있는 다른 방법이 있습니까? – yc2986