SORU
30 Ocak 2009, Cuma


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
30 Ocak 2009, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • beautyexchange

    beautyexchan

    4 EYLÜL 2006
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • PhoneArena

    PhoneArena

    7 NİSAN 2006