2011-11-21 19 views
14

Właśnie przeczytałem artykuł wiki o CRTP, a ja jestem nieco zdezorientowany w kwestii tworzenia szablonów.Utworzenie szablonu klasy

Według wiki,

ciała funkcji składowej (Definicje) nie są aż instancja długi po ich deklaracji.

Nie bardzo rozumiem, co to znaczy.

Załóżmy Mam klasy szablonu:

template <typename T> 
class A 
{ 
    public: 
     void foo(T t) 
     { 
      //... 
     }; 
}; 

Kiedy instancję klasy szablonu A, to instancję member function foo()?

Na przykład:

//in .cpp file 
int main() 
{ 
    A<int> a; //question 1 
       //class template is instantiated here, isn't it? 
       //What about foo(), is it instantiated too? 

    a.foo(10); //question 2 
       //according to the quotation, foo() will not be instantiated until it is used. 
       //if so, foo() is instantiated right here, not in question 1, right? 
} 
+2

Plug: To może odpowiedzieć na Twoje pytania: http: // stackoverflow.com/questions/7182359/template-instantiation-details-of-gcc-and-ms-compilers/7241548 # 7241548 –

Odpowiedz

12

Wydajesz się być mylące jedno:

Tworzenie instancji dzieje podczas kompilacji, nie w trakcie wykonywania. Dlatego nie można powiedzieć "w którym wierszu" utworzono szablon klasy lub szablon funkcji.

To prawda, masz rację, że szablony funkcji członków nie są tworzone razem z szablonami klas.

Można zaobserwować to w takim przypadku: Masz następujące pliki

  • template.h (definiuje klasa A i funkcja A :: foo)
  • a.cpp (A) wykorzystuje
  • b.cpp (używa A i A :: foo)

Następnie podczas kompilacji pliku a.cpp zostanie utworzona tylko litera A. Jednak podczas kompilacji b.cpp oba zostaną utworzone.

Z tego powodu, w przypadku, gdyby A :: foo zawierało pewien semantycznie nieprawidłowy kod dla danego zestawu parametrów szablonu, otrzymywałbyś błędy kompilacji w pliku b.cpp, ale nie a.cpp.

Mam nadzieję, że to wszystko wyjaśni!

+0

Teraz rozumiem, dziękuję. – Alcott

8

Z szablonów klas, reguła jest taka, że ​​są tworzone tylko te elementy, które są faktycznie używane.

Jeśli chcesz pełną instancji, C++ oferuje wyraźny konkretyzacji (zwykle jednak nie robić; fakt, że nie każdy bit jest w pełni instancję oznacza, że ​​klasa szablon jest nawet bardziej ogólny, ponieważ obniża wymagania dotyczące T , zauważ, że sprawdzanie składni i wyszukiwanie nie zależnych typów (rzeczy, które nie są zależne od T) nadal się dzieje).

Znajdziesz pełniejszą odpowiedź tutaj: Template instantiation details of GCC and MS compilers

+0

Awans na wspomnienie jawnej instancji wymuszonej kompletnej instancji – FaceBro

Powiązane problemy