2011-11-21 43 views
14

Sadece CRTP ile ilgili wiki makalesini okudum ve şablon örneği hakkında biraz kafam karıştı. wiki göre sınıf örneği örneği

,

üye işlev organları (tanımları) kendi beyanlarına sonra uzun kadar örneği değil.

Bunun ne anlama geldiğini anlamıyorum.

varsayalım bir sınıf şablonu var: Sınıf şablonu A örneğini zaman

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

, bu üye işlev foo örneğini mu()? Örneğin

: değil çalışma zamanı sırasında, derleme sırasında

Destekleme olur:

//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

Fiş: Bu sorulara cevap verebilir: http: // stackoverflow.com/questions/7182359/template-instantiation-details-of-gcc-ve-ms-derleyiciler/7241548 # 7241548 –

cevap

12

tek bir şey kafa karıştırıcı gibi görünüyor. Bu nedenle, "hangi satırda" bir sınıf şablonunun veya bir işlev şablonunun başlatıldığını söyleyemezsiniz.

Bu, üye işlev şablonlarının sınıf şablonları ile birlikte oluşturulmadığı konusunda haklısınız.

Sen böyle bir durumda bunu gözlemlemek olabilir: Sen

  • template.h
  • a.cpp (kullanmaktadır A)
  • (A sınıfı ve işlev A :: foo tanımlar) aşağıdaki dosyaları var
  • b.cpp (A ve A :: foo kullanır)

Daha sonra a.cpp'nin derlenmesi sırasında sadece A örneği oluşturulacaktır. Ancak, b.cpp'nin derlenmesi sırasında, her ikisi de örneklenecektir.

Bunun nedeni, A :: foo'nun belirli bir şablon parametresi kümesi için bazı semantik olarak geçersiz kod içermesi durumunda, b.cpp dosyasında derleme hataları alırsınız, ancak a.cpp değil.

İnşallah bu şeyleri temizler!

+0

Şimdi anlıyorum, teşekkürler. – Alcott

8

Sınıf şablonlarında, başparmak kuralı, yalnızca kullanılan üyelerin yalnızca örneklendirilmiş olmasıdır.

tamamladıktan örnekleme istiyorsanız

, C++ açık örnekleme (ancak, genelde değil mi sunar; her bit tam örneği değil aslında o T üzerinde gereksinimlerini düşürür gibi şablon sınıfı daha genel olduğu anlamına gelir , sözdizimi denetleme ve bağımlı olmayan türlerin ( T bağımlı olmayan şeyler) hala arama olduğunu unutmayın.

Burada daha tam cevap bulacaksınız: Template instantiation details of GCC and MS compilers

+0

Açık örnekleme kuvveti tam örnekleminden bahsetmeden daha fazlası – FaceBro