Jaka jest różnica między klasą szablonu a szablonem klasy?
Jest to częsty problem dla wielu osób (w tym strona programowania ogólnego w Wikipedii, niektóre samouczki C ++ i inne odpowiedzi na tej stronie). Jeśli chodzi o C ++, nie ma czegoś takiego jak „klasa szablonu”, istnieje tylko „szablon klasy”. Sposobem na odczytanie tego wyrażenia jest „szablon dla klasy”, a nie „szablon funkcji”, który jest „szablonem funkcji”. Ponownie: klasy nie definiują szablonów, szablony definiują klasy (i funkcje). Na przykład to jest szablon , a konkretnie szablon klasy , ale to nie jest klasa :
template<typename T> class MyClassTemplate
{
...
};
Deklaracja MyClassTemplate<int>
jest klasą lub pedantycznie klasą opartą na szablonie. Nie ma specjalnych właściwości klasy opartej na szablonie w porównaniu z klasą nieopartą na szablonie. Specjalne właściwości dotyczą samego szablonu .
Wyrażenie „klasa szablonu” nic nie znaczy, ponieważ słowo „szablon” nie ma znaczenia jako przymiotnik, gdy jest stosowane do rzeczownika „klasa” w C ++. Oznacza to istnienie klasy, która jest (lub definiuje) szablonem , a nie pojęciem istniejącym w C ++.
Rozumiem powszechne zamieszanie, ponieważ prawdopodobnie opiera się ono na fakcie, że słowa pojawiają się w kolejności „klasa szablonowa” w rzeczywistym języku, co jest zupełnie inną historią.
Bjarne Stroustrup, twórca C ++, mówi w swojej książce The C ++ Programming Language 4th edition , 23.2.1 Defining a Template:
źródło
Różnica polega na tym, że termin „klasa szablonu” po prostu nie istnieje w standardzie C ++. Jest to termin używany głównie przez ludzi, którzy uważają, że termin „szablon klasy” jest mylący (np. Firmy Qt - Nokia i dawniej Trolltech).
Standard nie ma na to żadnego pojęcia, więc to inne narody muszą coś zmienić. Niektórzy używają go jako synonimu, a inni twierdzą, że termin „klasa szablonu” odnosi się do utworzonego lub jawnie wyspecjalizowanego szablonu klasy, co byłoby równoznaczne z terminem „specjalizacja szablonu klas”. Historycznie miało to znaczenie. Podręcznik z adnotacjami definiuje na stronie 343
Non-końcowy szablon klasy-name jest równoważny non-końcowej Template-ID używany w dzisiejszym standardowe i zstępuje
template-name < arguments >
.Zapoznanie się z dzisiejszymi terminami, co jest ważniejsze niż używanie wątpliwych starych terminów
// (1) defines a class template template<typename T> class A { }; // (2) defines a class template explicit specialization template<> class A<int> { }; // (3) defines a class template partial specialization template<typename T> class A<T*> { }; // (4) explicitly instantiates A<char>. template class A<char>; // (5) implicitly instantiates A<short> (because of the member declaration) struct D { A<short> a; };
źródło
Klasa szablonu jest powiązana ze wzorcem projektowym metody szablonu , podczas gdy szablon klasy jest po prostu szablonem klasy „wypełnij puste miejsca”.
źródło
Szablon klasy to szablon używany do generowania klas, podczas gdy klasa szablonu to klasa tworzona przez szablon.
źródło
Klasa szablonu: Klasa, która ma definicję ogólną lub klasę z parametrami, której instancja nie jest tworzona, dopóki informacje nie zostaną dostarczone przez klienta. Odnosi się do żargonu dla zwykłych szablonów. Po prostu klasa z szablonem prefiksu i użycie T. Szablon klasy: Indywidualna konstrukcja klasy jest określona przez szablon klasy, który jest prawie podobny do sposobu, w jaki poszczególne obiekty są konstruowane przy użyciu klasy. Odnosi się do obiektu klasy szablonu Ex- nazwa klasy nazwa_obiektu (lista argumentów)
źródło
Szablon klasy to ogólna klasa dla różnych typów obiektów. Zasadniczo zawiera specyfikację generowania klas na podstawie parametrów. Za każdym razem, gdy tworzony jest nowy obiekt, w pamięci pojawi się nowa klasa. Nazywa się to tworzeniem wystąpienia szablonu klasy, a każda utworzona wersja klasy jest nazywana klasą szablonu.
źródło
Spójrz na ten artykuł (z wg21 i został opublikowany w 1992) :
template<class T> int nullcheck( T* pT ) { return ( pT != 0 ); }
template<class T> class S { int i; public: int sep_member(); int imm_member() { return 2; } }
class Normal { public: template<class T> int foo(T*pT) { return ( pT == 0 ); } };
template<class T> int S<T>::sep_member() { return i; }
źródło
Normal
klasie, którą opisałeś powyżej: Nie wiedziałem, że taki szablon funkcji składowej jest zabroniony. Jest akceptowany przez wszystkie kompilatory, których próbowałem. czego mi brakuje?