2016-04-11 25 views
0

Basit bir sorunum var ama gerçekten nedenini anlamıyorum. Bana yardım edebileceğini düşünüyorum.Şablon temelli bir sınıftan şablon temeli sınıfından nasıl türetilir

template <class T> class Base 
{ 
    public: 
     T foo(T t); 
    protected: 

     Base(); 
     ~Base(); 
}; 

bu şablonun bir uzmanlık türetmek istiyorum:

Bir şablon temel sınıf Tüm fonksiyonlar, ilgili .cpp tanımlanan

class Derived : public Base<std::string> 
{ 
    public: 
     Derived(); 
     virtual ~Derived(); 
}; 

(bunlar, boş sadece t döndüren foo hariç)

Örnek olarak std :: string'i seçtim. Ancak bu basit kod derlenmiyor. Ben hatalar var: "belirsiz başvuru için 'Baz :: Tabanı()' " belirsiz referans 'Base :: ~ Tabanı()'

Ben internette örnekler izleyin görünüyor ama çalışmıyor ... bunu gerçekten anlamıyorum, açık olmalı!

Yardımcı olabilir misiniz? :)

:

+1

* Sorunun * olup olmadığından emin değil, ancak Base :: ~ Base() 'sanal olmalıdır. – Biffen

+0

Hiçbir şey değiştirmez :( –

+1

Hataların ne olduğunu açıklamak yararlı değildir * gibi * Bize tam olarak * ne * hatalar: – user2079303

cevap

2

Bir sınıf şablonundan miras aldığınızda, temel dosya tanıtımı ve tanımının başlık dosyasında olması gerekir.

Bunun nedeni, derleyici, derleme süresi sırasında, kullandığınız türler için derleme zamanında şablonu örneğini başlatması gerektiğidir. Yabancı Cpp dosyalarına yalnızca bağlantı sırasında erişilir, dolayısıyla derleyici türetilen sınıfı başlatmaya çalıştığında şablon kodunu ve sonuçlardan bahsettiğiniz hatayı oluşturamaz.

0

Bu örnek mükemmel derler, böylece nerede sorundur (PS ingilizcem kötü ise üzgün)?

#include <string> 

template <class T> class Base 
{ 
    public: 
     T foo(T t) {}; 
    protected: 
     Base() {}; 
     ~Base() {}; 
}; 

class Derived : public Base<std::string> 
{ 
    public: 
     Derived() {}; 
     virtual ~Derived() {}; 
}; 

int main() 
{ 
    Derived derived; 
    return 0; 
} 
+0

Göründüğü gibi .hp içindeki işlevi tanımlamak gerekiyor, değil .cpp ... Bana nedenini söyleyebilir misiniz? –

+0

Diğer yorumuma bakın. Şablonları kullanırsanız, uygulamanızı üstbilgiye dahil etmeniz veya başka hilelere başvurmanız gerekir. Http: // stackoverflow dosyasına bakın.com/questions/1724036/splitting-templated-c-classes-içine-hpp-cpp-dosyaları-is-it-mümkün – Chiel

+0

Derleme ancak Base :: foo() 'çağıran ve dönüş değerini kullanan herhangi bir işlev tanımlanmamış davranış. – Peter

İlgili konular