2013-05-22 13 views
6

Wikipedia article mówi tak:Szablon klasy może być tworzony bez członków?

instancji szablonu klasy nie powoduje jego definicje członkowskim być instancja.

Nie mogę sobie wyobrazić żadnej klasy w C++, która jest instancjonowana, niezależnie od tego, czy z szablonu, czy też nie, gdzie członkowie klasy również nie zostali zainicjowani?

+0

Dotyczy funkcji członka. Ale mogę sobie wyobrazić, jeśli wywołasz statyczną metodę szablonu klasy, członkowie danych również nie muszą być tworzone. – juanchopanza

Odpowiedz

9

Wiele wczesnych kompilatorów C++ tworzyło wszystkie funkcje składowe, niezależnie od tego, czy kiedykolwiek je wywołałeś, czy nie.

Weź pod uwagę na przykład std::list, która ma funkcję członkowską sort. Przy obecnym, właściwie działającym kompilatorze można utworzyć instancję list nad typem, który nie obsługuje porównania. Jeśli spróbujesz użyć list::sort, to się nie powiedzie, ponieważ nie obsługujesz porównywania. Tak długo, jak nie wywołasz tej listy pod numerem sort, wszystko będzie w porządku, ponieważ list<T>::sort nie zostanie utworzone, chyba że zadzwonisz.

W przypadku starszych, źle działających kompilatorów próba utworzenia list<T> spowodowała, że ​​utworzono instancję list<T>::sort, mimo że nigdy jej nie używano. Istnienie list::sort oznaczało, że musisz wdrożyć < dla T, aby utworzyć list<T>, nawet jeśli w rzeczywistości nigdy nie używałeś sort na liście tego typu.

0

Metody zajęć są również członkami. Metody klasy szablonów są tworzone, gdy są wywoływane dla tej instancji klasy. Jest więc możliwe, że metody te nigdy nie zostaną utworzone.

1

Norma wyraźnie mówi, że (zarówno non-template jak i szablon) metody członkowskie powinny być tworzone tylko wtedy, gdy są używane.

Fragment standard C++ (N3690 - 14.7.1 (2) instancji niejawny)

2, o ile jest członkiem klasy matrycę lub matrycę użytkownik został wyraźnie wystąpienia lub wyraźnie wyspecjalizowane, specjalizacji członu jest niejawnie tworzony, gdy odwołanie do specjalizacji odbywa się w kontekście wymagającym definicji elementu; w szczególności inicjalizacja (i wszelkie związane z nią efekty uboczne) statycznego elementu danych nie występuje, dopóki statyczny element danych nie jest sam używany w sposób, który wymaga definicji statycznego elementu danych.

Powiązane problemy