2013-03-13 3 views
28

저는 템플릿에 익숙하지 않아 어쩌면 사소한 일이지만 어쩔 수 없습니다. 클래스 멤버 함수를 부분적으로 특수화하려고합니다. 가장 짧은 코드는 다음과 같습니다.C++ 템플릿 부분 특수화 멤버 함수

template <typename T, int nValue> class Object{ 
private: 
    T m_t; 
    Object(); 
public: 
    Object(T t): m_t(t) {} 
    T Get() { return m_t; } 
    Object& Deform(){ 
     m_t*=nValue; 
     return *this; 
    } 
}; 

template <typename T> 
Object<T,0>& Object<T,0>::Deform(){ 
    this->m_t = -1; 
    return *this; 
} 

int main(){ 
    Object<int,7> nObj(1); 
    nObj.Deform(); 
    std::cout<<nObj.Get(); 
} 

저는 비회원 함수를 사용해 보았는데 정상적으로 작동했습니다. 또한 잘 작동하는 것은 멤버 함수의 완전한 전문화입니다.

하지만 부분 사양으로 시도 할 때마다. 멤버 함수의 I 양식의 오류 :

PartialSpecification_MemberFu.cpp(17): error: template argument 
list must match the parameter list Object<T,0>& Object<T,0>::Deform(). 

당신은 부분적으로 단 하나의 멤버 함수를 전문으로 할 수

+1

관련 항목 : http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members –

답변

30

:-) 어떤 도움을 주셔서 감사합니다겠습니까, 당신은 부분적으로 전체 클래스를 전문으로해야합니다.

template <typename T> 
class Object<T, 0> 
{ 
private: 
    T m_t; 
    Object(); 
public: 
    Object(T t): m_t(t) {} 
    T Get() { return m_t; } 
    Object& Deform() 
    { 
     std::cout << "Spec\n"; 
     m_t = -1; 
     return *this; 
    } 
}; 
18

14.5.5.3.1 : 그래서 당신이 뭔가를해야합니다. 클래스 템플릿 부분 전문화의 멤버의 템플릿 매개 변수 목록은 클래스 템플릿 부분 전문화의 템플릿 매개 변수 목록과 일치해야합니다. 클래스 템플릿 부분 전문화의 멤버의 템플릿 인수 목록은 클래스 템플릿 부분 전문화의 템플릿 인수 목록과 일치해야합니다.

즉 부분적으로 특수화 된 클래스가없는 부분적으로 특수화 된 멤버가 없습니다.

3

불행히도 템플릿 클래스의 멤버 함수를 부분적으로 특수화 할 수는 없습니다. 부분적으로 전체 클래스를 전문화하거나 상속을 사용할 수 있습니다. 다음 두 가지를 모두 사용할 수도 있습니다.

template <typename T, int nValue> 
class Object { 
protected: 
    T m_t; 
public: 
    Object() = delete; 
    Object(T t): m_t(t) {} 
    T Get() { return m_t; } 
    Object& Deform() { 
     m_t *= nValue; 
     return *this; 
    } 
}; 

template <typename T> 
class Object<T,0> : public Object<T,1> { 
public: 
    using Object<T,1>::Object; 

    Object& Deform() { 
     this->m_t = -1; 
     return *this; 
    } 
}; 
관련 문제