Neden şablonlar sadece başlık dosyasında uygulanabilir?
The C standard library: a tutorial and handbook alıntı:
Şu anda şablonları kullanarak tek taşınabilir şekilde satır içi işlevleri kullanarak, başlık dosyaları içinde uygulamaktır.
Neden bu?
(Açıklama: değil . dosya Başlığı ^em>sadecetaşınabilir çözüm. Ama en rahat taşınabilir bir çözüm.)
CEVAP
değilbaşlık dosyasında uygulamaya koymak için gerekli, bu cevap sonunda alternatif çözüm bakın.
Neyse, kodunuzu başarısız olmasının nedeni, bir şablon oluşturulurken derleyici belirli bir şablon argümanı ile yeni bir sınıf oluşturur. Örneğin:
template<typename T>
struct Foo
{
T bar;
void doSomething(T param) {/* do stuff using T */}
};
// somewhere in a .cpp
Foo<int> f;
Bu satırı okurken, derleyici aşağıdaki eşdeğeri olan yeni bir sınıf (hadi FooInt
çağrı), oluşturur:
struct FooInt
{
int bar;
void doSomething(int param) {/* do stuff using int */}
}
Sonuç olarak, derleyici yöntemleri uygulanması için erişim, şablon bağımsız değişken (bu durumda int
) ile onları oluşturmak için olması gerekir. Eğer bu uygulamalar başlığında olsaydı, erişilebilir olmaz, ve bu nedenle derleyici şablon oluşturmak mümkün olmaz.
Bu ortak bir çözüm header dosyasına şablon bildirimi yazmak, uygulama bir dosya sınıfı uygulamak için (örneğin .DYP), ve bu uygulama vardır başlığının sonunda dosya.
// Foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};
#include "Foo.tpp"
// Foo.tpp
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}
Bu şekilde, uygulama hala beyannamesi ayrılır, ancak derleyici tarafından erişilebilir.
Başka bir çözüm uygulanması ayrı tutmak ve açıkça tüm şablon örneği oluşturmak gerekir:
// Foo.h
// no implementation
template <typename T> struct Foo { ... };
//----------------------------------------
// Foo.cpp
// implementation of Foo's methods
// explicit instantiations
template class Foo<int>;
template class Foo<float>;
// You will only be able to use Foo with int or float
Eğer benim açıklamam yeterince açık değil mi eğer, C Super-FAQ on this subject de bir göz atabilirsiniz.
Neden Javascript sadece IE Geliştirici...
Neden yok't bu kod sadece A-Z ara...
Neden #ifndef ve #c başlık dosyaları t...
HTTP POST cevap başlık curl kullanarak...
Ben tüm ASP.Net Web siteleri yavaş ve ...