2013-03-22 18 views
6

Próbuję napisać klasę szablonu, która może tworzyć klasy w zależności od przepustki <class> I. Problem polega na tym, że nie mogę zadeklarować i zdefiniować w tym samym pliku .h. W moim projekcie narzędzie UTF może działać tylko z plikami .cpp (dla pokrycia kodu itp.). Widziałem na blogu, że mówią "Dodaj .cpp zamiast .h". Czy to jest wskazane?Oddzielne pliki .h i .cpp w implementacji klasy szablonów

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; 
} 

Jeśli nie jest to wskazane, to w jaki sposób mogę rozwiązać ten problem? export?

Odpowiedz

4

Szablony muszą być zdefiniowane w każdej jednostce tłumaczeniowej, w której są używane. Oznacza to, że muszą być zdefiniowane w plikach nagłówkowych. Jeśli twoje narzędzie nalega na rozszerzenie .cpp, możesz je również dostarczyć, tak jak Ty.

W tym przypadku nie trzeba nawet dzielić pseudo-nagłówka na .h i .cpp. Możesz po prostu włożyć to wszystko do tego.

+0

To nie jest ściśle zgodne z prawdą. Chociaż najwygodniej jest umieszczać definicje w każdej jednostce tłumaczeniowej, a co za tym idzie - zwykłą praktykę, nie jest to wymogiem. –

+0

@MarkRansom Yup, masz rację. Jednak rzadko zdarza się, aby wszystkie wymagane instancje jawne były wykonywane z wyprzedzeniem. – Angew

7

Kompilator musi mieć dostęp do wdrożenia metod w celu instancję klasy szablonu, co najbardziej powszechną praktyką jest albo zawierają definicji szablonu w pliku nagłówka, który deklaruje, że szablon lub do zdefiniować je w plikach nagłówkowych.

Zobacz Why can templates only be implemented in the header file?

Powiązane problemy