2013-07-09 3 views
3

C++ 템플릿 부분 특수화

나는 .hpp 파일의 클래스가 ... 누군가가 전에 부탁하지만 난 그것을 찾을 수없는 질문이있을 수 있습니다 int의 경우 double이지만 문자열의 경우는 그렇지 않습니다. 따라서 내 .hpp 파일에, 나는 번호를 수행하고 내 .cpp 파일에 내가 쓴 func 정의 :

template<> 
void A::func(std::string t){ // do something in that case} 

하지만 std::string와 기능 func를 사용할 때, 프로그램이 ... 숫자에 대한 메소드를 호출 I 그래서 하여 .hpp 파일을 대체 :

class A{ 
    public: 
     A(){//constructor} 
     ~A(){//destructor} 
     //some public methods and arguments 

     template<typename Type> 
      void func(Type t){//do something for numbers} 
     void func(std::string s); 

    private: 
     //some private methods and arguments 
} 

.cpp 파일이되었다 :

void A::func(std::string t){ // do something in that case} 

그리고 모든 것이 작동합니다!

제 질문은 올바른 방법입니까?

+0

두 번째 큰 블록이 cpp가 아닌 hpp라고 가정합니다. 사실입니까? – Bruce

+0

네, 저 실수를 편집했습니다 ... 죄송합니다. – PinkFloyd

+0

pb가 없으므로 직접 편집하지 않으 셨습니다. – Bruce

답변

3

이것은 부분 특수화가 아닙니다 (템플릿 매개 변수가 특수화되지 않은 채로 남아 있지 않음) 명시 적 전문화입니다.

템플릿을 헤더 파일에서 특수화를 선언하지 않고 string을 사용하여 A::func을 호출하려고하는 코드가 기본 템플릿 (숫자 용)을 인스턴스화하고 사용할 코드를 사용해야합니다. 왜냐하면 그들은`문자열 전문화조차 존재하지 않는다. 그것은 .cpp 파일 outsde 사용할 수하는

그래서 당신은 (적어도) 순서 헤더의 전문화를 선언해야합니다 :

template<> 
void A::func(std::string t); 

과부하를 사용하여 대안은 간단하고 완벽하게 수용하지만

. string에 대한 오버로드가 헤더에 선언되어 있기 때문에 작동합니다. 따라서 호출하는 코드는 호출 할 함수를 알고 있습니다.

+0

헤더가'template <> void func (std :: string s) {// ~ 무언가}'또는'void func (std :: string s) {// do something}'을 올바르게 이해하고 있다면'? – PinkFloyd

+0

아니요, 올바르게 이해하지 못했습니다. 그것들은 정의입니다. 헤더는 선언이 아니라 정의를 포함해야합니다 ('inline'으로 표시된 경우 정의를 포함 할 수도 있음) –

+0

하지만 템플릿의 경우 헤더 파일에 정의가 있습니다 ...! – PinkFloyd

0

오버로드는 다양한 용도로 사용하기에 적합합니다. 그러나 const char *의 전문화 영역을 추가해도 원래의 템플릿 접근 방식이 효과가 있다고 판단됩니다. 그렇게하면 숫자 리터럴로 변환하지 않고 문자열 리터럴을 전달할 수 있습니다.

+0

나는 당신이 무슨 뜻인지 이해하지 못했습니다 ..."숫자 버전으로 해결"이란 무엇입니까? – PinkFloyd

+0

원래의 질문에서 문자열에 특화된 방법 대신 숫자에 대한 방법이 호출되고 있음을 나타 냈습니다. 나는 틀릴 수도 있지만 내 생각 엔 당신이 문자열 리터럴을 전달하고 있다는 것입니까? 문자열 리터럴은 'const char *'를 해결합니다. 이는 숫자 유형이므로 숫자가 아닌 numbers 메서드를 호출하는 이유입니다. –

+0

다음과 같이 :'func ("blalba")'? 아니, 나는이 문자열을 전달했다. std :: string s ("blabla"); func (s)'를 참조하십시오. – PinkFloyd