2013-03-22 15 views
6

<class> I geçişine bağlı olarak sınıf oluşturabilen bir şablon sınıfı yazmaya çalışıyorum. Sorun aynı .h dosyasında bildiremem ve tanımlayamıyorum. Benim projemde, UTF aracı sadece .cpp dosyaları (kod kapsamı, vb.) Ile çalışabilir. Bir blogda “.h yerine .cpp ekle” dediklerini gördüm. Bu tavsiye edilebilir mi? Bu o zaman tavsiye edilmez iseŞablon sınıfı uygulamasında ayrı .h ve .cpp dosyaları

Template.h

#ifndef TEMPLATE_H_ 
#define TEMPLATE_H_ 

template<class T> 
class Template 
{ 
public: 
    T Add(T a,T b); 
}; 

#endif /* TEMPLATE_H_ */ 

Template.cpp

#include "Template.h" 

template<class T> 
T Template<T>::Add(T a, T b) 
{ 
    return a+b; 
} 

Main.cpp

#include "Template.cpp" //Is this a good practise? 
#include <iostream> 

int main(int argc, char **argv) { 
    Template<int> obj; 
    std::cout<<obj.Add(3,4)<<std::endl; 
} 

bu sorunu nasıl çözerim? export?

cevap

4

Şablonlar, kullandıkları her çeviri biriminde tanımlanmalıdır. Bu, başlık dosyalarında tanımlanması gerektiği anlamına gelir. Aracınız .cpp uzantısında ısrar ediyorsa, aynen sizin yaptığınız gibi bunu da sağlayabilirsiniz.

Bu durumda sözdizimini .h ve .cpp'a bölmeniz bile gerekmez. Her şeyi .cpp ve #include'da bulabilirsiniz.

+0

Bu, tam olarak doğru değildir. Her çeviri birimine ve dolayısıyla ortak uygulamaya tanımlamaların yerleştirilmesi en elverişli olmakla birlikte, bu bir gereklilik değildir. –

+0

@MarkRansom Yup, haklısınız. Ancak, gerekli tüm açık örneklemelerin "önceden" yapılabilmesi oldukça nadirdir. – Angew

7

Derleyici böylece en yaygın uygulama ya bu şablonu beyan başlık dosyasında bir şablon tanımlarını içermelidir olduğunu şablon sınıf örneğini amacıyla yöntemlerin uygulanması için bir erişim olması gerekiyor veya , bunları başlık dosyalarında tanımlar.

Bkz. Why can templates only be implemented in the header file?

İlgili konular