2014-09-08 8 views
6

Mam tylko plik hpp dla zadania szkolnego w C++ (nie wolno mi dodawać pliku cpp, deklaracja i implementacja powinny być zapisane w pliku).klasa szablonowa z jedną metodą specjalizującą się w C++

Napisałem ten kod wewnątrz niego:

template<class T> 
class Matrix 
{ 
    void foo() 
    { 
     //do something for a T variable. 
    } 
}; 

Chciałbym dodać inną metodę foo, ale to foo() będą specjalizuje się tylko <int>. Czytałem w niektórych miejscach, że muszę zadeklarować nową klasę specjalizacji, aby to działało. Ale to, co chcę, jest to, że wyspecjalizowana foo będzie leżeć tuż pod oryginalnym foo, więc będzie wyglądać następująco:

template<class T> 
class Matrix 
{ 
    void foo(T x) 
    { 
     //do something for a T variable. 
    } 
    template<> void foo<int>(int x) 
    { 
     //do something for an int variable. 
    } 
}; 
  • Dlaczego otrzymuję błąd na tej składni ("Oczekuje niewykwalifikowany-id przed" < "token")?
  • Dlaczego to nie jest możliwe?
  • Jak mogę to naprawić bez deklarowania nowej specjalistycznej klasy?

Dzięki

+0

'foo' nie jest szablonem. 'Matrix' jest. –

+0

Otrzymujesz błąd, ponieważ narusza to składnię C++. Nie możesz specjalizować tylko członka klasy szablonu, ale musisz specjalizować całą klasę. – 101010

+0

Ale mam wiele innych funkcji w tej klasie, więc czy muszę skopiować i wkleić wszystkie te funkcje do nowej klasy "int"? brzmi jak straszne powtórzenie kodu. – user2630165

Odpowiedz

10

foo nie jest szablonem. Jest to funkcja członkowska szablonu. Zatem foo<int> jest bez znaczenia. (Również wyraźne specjalizacje muszą być zadeklarowane w zakresie przestrzeni nazw.)

Można jawnie specjalizują funkcję członka danego niejawny konkretyzacji szablonu Klasa:

template<class T> 
class Matrix 
{ 
    void foo(T x) 
    { 
     //do something for a T variable. 
    } 
}; 

// must mark this inline to avoid ODR violations 
// when it's defined in a header 
template<> inline void Matrix<int>::foo(int x) 
{ 
    //do something for an int variable. 
} 
+0

Awesome. ale, czy to jest dozwolone, aby napisać tę linię: template <> void Matrix :: foo (int x) wewnątrz pliku hpp? bo zwykle widzę to tylko w plikach cpp. – user2630165

+0

@ user2630165 Tak, jest w porządku ... musisz jednak wykonać 'inline'. –

0

trzeba zdefiniować oryginalną metodę foo jako szablon, a właściwie nie ma potrzeby klasa się szablon, tylko metoda:

class Matrix 
{ 
    template<typename T> void foo(T x) 
    { 
     //do something for a T variable. 
    } 
    template<> void foo<int>(int x) 
    { 
     //do something for an int variable. 
    } 
}; 

UPDATE: kod działa tylko w Visual Studio. Oto kod, który powinien również działać w innym miejscu:

class Matrix 
{ 
    template<typename T> void foo(T x) 
    { 
     //do something for a T variable. 
    } 
}; 

template<> void Matrix::foo<int>(int x) 
{ 
    //do something for an int variable. 
} 
+1

Nie kompiluje: 'error: jawna specjalizacja w zakresie przestrzeni nazw 'class Matrix'' ... – Jarod42

+0

Zgadza się, napisany przeze mnie kod jest kompatybilny tylko ze studiem visual. Dodałem kod zgodny z C++, który powinien działać również z GCC. – Adam

+1

Jestem prawie pewna, że ​​OP potrzebuje szablonu "Matrix". – jrok