2013-03-22 5 views
6

मैं एक टेम्पलेट क्लास लिखने की कोशिश कर रहा हूं जो <class> पर आधारित कक्षाएं बना सकता है। समस्या यह है कि मैं उसी .h फ़ाइल में घोषित और परिभाषित नहीं कर सकता। मेरी परियोजना में, यूटीएफ उपकरण केवल .cpp फ़ाइलों (कोड कवरेज आदि के लिए) के साथ काम कर सकता है। मैंने एक ब्लॉग में देखा है कि वे कहते हैं " के बजाय .cpp जोड़ें"। क्या यह सलाह दी जाती है?टेम्पलेट क्लास कार्यान्वयन में अलग .h और .cpp फ़ाइलें

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

यदि यह तो उचित नहीं है कि कैसे मैं इस समस्या को हल करते हैं? export?

उत्तर

4

टेम्पलेट्स को प्रत्येक अनुवाद इकाई में परिभाषित किया जाना चाहिए जिसमें उनका उपयोग किया जाता है। इसका मतलब है कि उन्हें हेडर फाइलों में परिभाषित किया जाना चाहिए। यदि आपका टूल एक्सटेंशन .cpp पर जोर देता है, तो आप इसे भी प्रदान कर सकते हैं, जैसा आपने किया था।

आपको इस मामले में छद्म-हेडर को .h और .cpp में विभाजित करने की भी आवश्यकता नहीं है। आप इसे सभी .cpp और #include में डाल सकते हैं।

+0

यह सख्ती से सच नहीं है। हालांकि प्रत्येक अनुवाद इकाई में परिभाषाओं को रखना सबसे सुविधाजनक है, और इस प्रकार सामान्य अभ्यास, यह एक आवश्यकता नहीं है। –

+0

@MarkRansom Yup, आप सही हैं। हालांकि, "अग्रिम में" सभी आवश्यक स्पष्ट तत्कालताओं को करने में सक्षम होना बहुत दुर्लभ है। – Angew

7

संकलक आदेश टेम्पलेट वर्ग का दृष्टांत में तरीकों के कार्यान्वयन के लिए एक उपयोग करने की जरूरत है, इस प्रकार सबसे आम बात के लिए या तो है कि उस टेम्पलेट वाणी हेडर फाइल में एक टेम्पलेट की परिभाषाओं में शामिल है या उन्हें शीर्षलेख फ़ाइलों में परिभाषित करें

Why can templates only be implemented in the header file?

संबंधित मुद्दे