2013-03-13 18 views
28

Jestem nowy w szablonach, więc może to jest banalne, ale nie mogę go uruchomić. Próbuję uzyskać częściową specjalizację funkcji członka klasy. Najkrótszy kod to:C++ szablon częściowa specjalizacja członek funkcja

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(); 
} 

Próbowałem z funkcjami bez funkcji użytkownika i to działało dobrze. To, co działa dobrze, to pełna specjalizacja funkcji członka.

Ale za każdym razem, gdy próbuję z częściową specyfikacją. z funkcji członka otrzymuję błąd w postaci:

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

Czy wdzięczni za każdą pomoc :-)

+1

Dotyczy również: http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members –

Odpowiedz

30

Nie można częściowo specjalizują się tylko jedną funkcję składową, trzeba częściowo specjalizują całą klasę. Dlatego trzeba coś takiego:

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. Lista parametrów szablonu elementu specjalizacji częściowej szablonu klasy musi być zgodna z listą parametrów szablonu częściowej specjalizacji szablonu klasy. Lista argumentów szablonu członka szablonowej specjalizacji częściowej klasy musi być zgodna z szablonową listą argumentów częściowej specjalizacji szablonów klas.

Innymi słowy: brak częściowo wyspecjalizowanego członka bez częściowo wyspecjalizowanej klasy.

3

Niestety, nie można częściowo wyspecjalizować funkcji składowej klasy szablonu. Możesz albo częściowo specjalizować całą klasę, albo dziedziczyć dziedziczenie. Możesz także użyć obu:

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; 
    } 
}; 
Powiązane problemy