Jaka jest różnica między klasą szablonu a szablonem klasy?
Odpowiedzi:
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:
Są ludzie, którzy dokonują semantycznych rozróżnień między szablonem klasy a klasą szablonu . Ja nie; byłoby to zbyt subtelne: rozważ te terminy zamiennie. Podobnie uważam szablon funkcji za wymienny z funkcją szablonu .
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
Klasa wygenerowana z szablonu klasy jest nazywana klasą szablonu, podobnie jak klasa specjalnie zdefiniowana z nazwą klasy szablonu jako nazwą
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; };
Klasa szablonu jest powiązana ze wzorcem projektowym metody szablonu , podczas gdy szablon klasy jest po prostu szablonem klasy „wypełnij puste miejsca”.
Szablon klasy to szablon używany do generowania klas, podczas gdy klasa szablonu to klasa tworzona przez szablon.
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)
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.
Spójrz na ten artykuł (z wg21 i został opublikowany w 1992) :
Spójna terminologia
Wiele dotychczasowych argumentów i sporów dotyczyło terminologii używanej w rozdziale opisującym szablony. Najczęściej stosowano różne określenia „szablon funkcji” i „funkcja szablonu” w celu wyrażenia różnych pomysłów i zamiarów. Ponieważ nie zastosowano spójnego nazewnictwa, wynikiem jest zamieszanie i kłótnia.
Do celów niniejszego dokumentu, jako propozycja formalnego przyjęcia przez komisję podczas dyskusji na temat szablonów oraz w celu wyjaśnienia dokumentacji; Proponuję przyjąć formalizację, zgodnie z którą końcowy „-szablon” opisuje zestaw typów lub funkcji opisanych przez szablon. I że wiodący „ szablon-” jest używany do opisania definicji szablonu części „-szablonu” , na przykład
'template-member-function'. Zatem: -
- „szablon funkcji”: zbiór funkcji opisanych przez szablon, parametrycznych na podstawie informacji o typie dostarczonych jako argument tego szablonu. Na przykład :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- „szablon-klasy”: zbiór klas opisanych przez szablon, parametryczny na podstawie pewnych informacji o typie dostarczonych jako argument do tego szablonu. Na przykład :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- „funkcja-szablonu”: ten termin nie jest już dozwolony. **
„template-class”: ten termin jest niedozwolony. **
„Szablon funkcji elementu członkowskiego”: ten termin jest niedozwolony, ponieważ opisuje właściwość, która nie jest obecnie obsługiwana przez definicję szablonu. Używając powyższej konwencji terminologicznej, opisałoby to członka szablonu innego niż klasa, którego definicja sama w sobie była szablonem. Na przykład :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
Ponieważ jednak szablony są obecnie ograniczone do zakresu globalnego, taki szablon jest nieprawidłowy.
- „template-static-member-function”:
- „szablon-element-funkcja”:
- „template-static-member”:
- „template-static-data-member ” template-member ”: Alternatywne terminy dla definicji członka występujące oddzielnie od„ szablonu klasy ”, do którego on należy. Na przykład :-
template<class T> int S<T>::sep_member()
{ return i; }
Normalklasie, 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?