2010-03-08 14 views
7

में गार्ड शामिल हैं क्या यह टेम्पलेट कक्षाओं के आसपास गार्ड शामिल करना बुद्धिमान है?टेम्पलेट कक्षाएं और सी ++

प्रत्येक बार जब आप उन्हें एक अलग कार्यान्वयन के साथ संदर्भित करते हैं तो टेम्पलेट कक्षाओं को दोबारा पोस्ट नहीं किया जाना चाहिए?

नायब विजुअल C++ 2008 में मैं संयोजन कोई त्रुटि प्राप्त दो ...

उत्तर

8

टेम्पलेट्स परिभाषाएँ एक बार पार्स किया जा सकता है (और दो चरणों नाम लुकअप तरह बातें यहाँ हैं ताकि जितना संभव हो उतना त्रुटियों हो सकता है अपेक्षा की जाती है तत्काल बिना किसी दिए गए तुरंत)। तत्कालियां उस समय निर्मित आंतरिक डेटा संरचना का उपयोग करके की जाती हैं।

टेम्पलेट परिभाषा आमतौर पर होती है (यानी यदि आप export का उपयोग नहीं कर रहे हैं या कुछ विशेष कर रहे हैं) हेडर फाइलों में जिसमें उनके गार्ड शामिल होना चाहिए। टेम्पलेट परिभाषा के लिए एक जोड़ना बेकार है लेकिन हानिकारक नहीं है।

+5

क्या जोड़ों को हमेशा शामिल करें, इसमें उपयोग करें, क्योंकि यह एक अच्छा अभ्यास है। – Poni

+1

यदि आप Win32 पर कोई भी विकास करते हैं, तो जब भी गार्ड का उपयोग करते हैं तो '#pragma एक बार' शामिल करें। – KitsuneYMG

+0

+1 यह बताते हुए कि तत्काल स्वीकृति – Otuken

12

आपको गार्ड शामिल करने की आवश्यकता है। इस कोड पर विचार करें:

// this is t.h 
template <typename T> 
void f(T t) { 
} 

// this is t.cpp 
#include "t.h" 
#include "t.h" 

int main() { 
    f(1); 
} 

यह त्रुटि देता है:

t.h:2: error: redefinition of 'template<class T> void f(T)' 
t.h:2: error: 'template<class T> void f(T)' previously declared here 

इसके अलावा, हेडर कि टेम्प्लेट हो नियमित रूप से भी गैर टेम्पलेट कोड होता है।

+2

के समय बनाई गई आंतरिक डेटा संरचना का उपयोग करके तत्काल किया जाता है, यह एक टेम्पलेट वर्ग की बजाय एक टेम्पलेट फ़ंक्शन है, लेकिन सिद्धांत समान है - यदि आप घोषित करते हैं तो आपको एक से अधिक परिभाषा त्रुटि मिलती है एक ही कक्षा दो बार, टेम्पलेट या नहीं। –

+0

मेरा उत्तर यहां देखें - http://stackoverflow.com/questions/22595015/c-class-template-undefined-reference-to-function/26816994#26816994 – v010dya

2

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

2

अपने पहले प्रश्न का उत्तर देने के लिए: हाँ, यह बुद्धिमान और अनिवार्य है, जिसमें टेम्पलेट कक्षाओं के आसपास गार्ड शामिल हैं। या हर शीर्ष फ़ाइल की पूरी सामग्री के आसपास अधिक कड़ाई से आसपास।

जब आपके पास हेडर फाइलों में सामान होता है तो यह एक परिभाषा नियम का पालन करने का तरीका है, ताकि यह साझा और सुरक्षित हो। अन्य हेडर फाइलें हो सकती हैं जिनमें आपका शामिल है। जब संकलक एक मॉड्यूल फ़ाइल संकलित करता है, तो यह आपके हेडर फ़ाइल के #include को कई बार देख सकता है, लेकिन गार्ड दूसरे और बाद के समय पर किक-इन देख सकते हैं ताकि संकलक केवल एक बार सामग्री को देख सके।

इससे कोई फर्क नहीं पड़ता कि संकलक कुछ भी दोहराता है; यह उसका काम है। आपको बस एक बार सामग्री की आपूर्ति करनी है और फिर संकलक ने इसे देखा है और इसे जितनी बार आवश्यकता हो उतनी बार संदर्भित कर सकते हैं।

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