Derleme adımı sırasında bir şablon kullandığınızda, derleyici her şablon örneği için kod oluşturur. Derleme ve bağlama işleminde .cpp dosyaları, main.cpp'nizde bulunan .h dosyalarının uygulama YET'i olmadığından, içinde referanslar veya tanımlanmamış semboller içeren saf nesneye veya makine koduna dönüştürülür. Bunlar, şablonunuz için bir uygulama tanımlayan başka bir nesne dosyasıyla bağlanmaya hazırdır ve bu nedenle tam bir a.out yürütülebilir dosyasına sahip olursunuz.
Ancak, tanımladığınız her şablon örneği için kod oluşturmak amacıyla şablonların derleme adımında işlenmesi gerektiğinden, üstbilgi dosyasından ayrı bir şablon derlemek işe yaramaz, çünkü bu nedenle her zaman el ele gider. her şablon örneğinin, kelimenin tam anlamıyla yepyeni bir sınıf olduğunu. Normal bir sınıfta .h ve .cpp'yi ayırabilirsiniz, çünkü .h bu sınıfın bir taslağıdır ve .cpp ham uygulamadır, böylece tüm uygulama dosyaları düzenli olarak derlenebilir ve bağlanabilir, ancak şablonlar kullanmak .h, sınıf, nesnenin bir şablonun nasıl görünmesi gerektiği biçimine bakmamalıdır .cpp dosyası bir sınıfın ham normal uygulaması değil, sadece bir sınıf için bir taslaktır, bu nedenle .h şablon dosyasının herhangi bir uygulaması '
Bu nedenle şablonlar hiçbir zaman ayrı ayrı derlenmez ve yalnızca başka bir kaynak dosyada somut bir somut örneğinizin olduğu her yerde derlenir. Ancak, somut somutlaştırmanın şablon dosyasının uygulanmasını bilmesi gerekir, çünkütypename T
.hpp dosyasında somut bir tür kullanmak işi yapmayacaktır çünkü bağlantı için .cpp orada ne var, daha sonra bulamıyorum çünkü şablonları soyut ve derlenemez hatırlıyorum, bu yüzden zorla ne derlemek ve bağlantı bilmek biliyorum şimdi ve şimdi vermek için, ve şimdi uygulama kaynak dosyası içine bağlı alır. Temel olarak, bir şablon oluşturduğum anda tamamen yeni bir sınıf oluşturmam gerekiyor ve derleyiciye haber vermedikçe, sağladığım türü kullanırken bu sınıfın nasıl görünmesi gerektiğini bilmiyorsam bunu yapamam şablon uygulaması, böylece derleyici T
benim türüm ile değiştirebilir ve derlenip bağlanmaya hazır somut bir sınıf oluşturabilir.
Özetle, şablonlar sınıfların nasıl görünmesi gerektiğine dair taslaklardır, sınıflar bir nesnenin nasıl görünmesi gerektiğine dair taslaklardır. Derleyicileri yalnızca somut türleri derlediğinden, başka bir deyişle, en azından C ++ 'daki şablonlar saf dil soyutlaması olduğundan, somut örneklemelerinden ayrı şablonları derleyemiyorum. Şablonları konuşmak için soyutlamalıyız ve bunları ele almaları için somut bir tür vererek şablon soyutlamasının normal bir sınıf dosyasına dönüşebilmesini ve normal olarak derlenebilmesini sağlarız. Şablon .h dosyasını ve şablon .cpp dosyasını ayırmak anlamsızdır. Bu .cpp ve .h'nin ayrılması yalnızca .cpp'in ayrı ayrı derlenebildiği ve şablonlarla ayrı ayrı bağlanabildiği bir yerdir, çünkü bunları ayrı olarak derleyemediğimiz için şablonlar bir soyutlamadır,
Anlam typename T
get derleme adımı sırasında bağlantı adım değil değiştirilir, bu yüzden bir şablonu T
derleyici için tamamen anlamsız somut bir değer türü olarak değiştirmeden derlemeye çalışırsam ve sonuç olarak nesne kodu oluşturulamaz çünkü ne T
olduğunu bilmek .
Template.cpp dosyasını kaydedecek ve diğer kaynaklarda bulduğunda türleri kapatacak bir tür işlevsellik oluşturmak teknik olarak mümkündür, standardın export
şablonları ayrı bir yere koymanıza izin verecek bir anahtar kelimeye sahip olduğunu düşünüyorum cpp dosyası ama pek çok derleyici aslında bunu uygulamak değil.
Sadece bir yan not, bir şablon sınıfı için uzmanlık yaparken, üstbilgiyi uygulamadan ayırabilirsiniz, çünkü tanım gereği bir uzmanlaşma, ayrı ayrı derlenip bağlanabilen somut bir tür için uzmanlaştığım anlamına gelir.