2016-04-10 23 views
-1

Bu sayfayı okudum Why can templates only be implemented in the header file? ama bir şablon sınıfı hakkında. Ve yapıcı sınıf ile aynı tür alır (sınıf < int> ise, kurucu da int alır, vb.). Ama basit (şablonsuz) bir dersim var. Çoğaltma için özür dilerim, lütfen bu durumda ne yapmalıyım?Şablon yapıcısının gerçekleştirilmesi nasıl ayırt edilir (sınıf şablon değilse)

'Çift d' alanına sahip bir 'Nesne' sınıfım var ve bir şablon yapıcı yapmak istiyorum. Eğer sınıf içinde fark edersem, her şey iyi, ama eğer gerçekleştirmeyi sınıfın dışına taşırsak (.h'den .cpp'ye), işe yaramıyor. İşte benim kod:

Object.h

class Object { 
    double d; 
public: 
    template <class T> Object(T t); 
}; 

Object.cpp

#include "Object.h" 

template <class T> Object::Object(T t) { 
    d = t; 
} 

x oluşturur

#include "Object.h" 

int main() { 
    int a = 5; 
    Object x(a); 
    float b = 2.5; 
    Object y(b); 
    return 0; 
} 

Hata hatlarında main.cpp görünen main.cpp ve y:

undefined reference to `Object::Object<int>(int)' 
undefined reference to `Object::Object<float>(float)' 
+1

[% Şablonlar neden sadece başlık dosyasında uygulanabilir?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header -dosyadan) – ForceBru

cevap

1

Object.cpp'dan kurtulun ve içeriğini bir başlık dosyasına taşıyın.

Derleyici Object.cpp ile ilgiliyse, yalnızca bazı şablonlar olduğundan herhangi bir byte kodu oluşturmaz. Kodunuzda Object::Object<int>(int) 'dan bahsediliyorsa, başlık dosyasına gider, şablon parametrelerini çıkarır ve her şeyi başarıyla derler.

Linker, ancak mutlu değil. Object::Object<int>(int) numaralı aramayı görür, ancak bu yöntem için bayt kodu bulamaz ve bir hata oluşturur.

Aksi takdirde, içinde template <class T> Object::Object(T t) tanımlayabilirsiniz, ancak bu çok iyi değildir ve karışıklığa neden olabilir.

+0

ekleme hakkında net bir açıklama – Pavel

+0

için teşekkür ederiz "şablon sınıfı Nesne ; şablon sınıfı Nesne ;" main.cpp başında - Ben şablon olmayan sınıf var çünkü (değil çalışmıyor " şablon Nesne ", ancak basit" sınıf Nesne "). – Pavel

+0

@Pavel, yep, bunu fark ettiğiniz için teşekkürler. Düzenlendi – ForceBru

0

Başlık dosyasında kullanmak istediğiniz tüm şablonlarını uygulamanız gerekir. Bunları sadece .cpp dosyasında uygularsanız, sadece bu .cpp dosyası görebilir.

İlgili konular