मैं a.h
क्यों स्पष्ट टेम्पलेट इन्स्टेन्शियशन की स्थिति बात
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
में एक टेम्पलेट वर्ग A
घोषित और
#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
(true
के लिए स्पष्ट instatiation और false
के साथ) a.cpp
में प्रिंट विधि को परिभाषित करता है कहो main.cpp
में एक मुख्य मुख्य कार्यक्रम
उपरोक्त छोटी परियोजना सिर्फ ठीक है।
प्रश्न: यदि मैं print
विधि (a.cpp
में) की परिभाषा के ऊपर स्पष्ट instantiations शब्दों में कहें, कोड सामान्य undefined reference to A<true>::print(...)
त्रुटि के साथ अब और संकलन नहीं है।
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
ऐसा क्यों है?
संपादित: Makefile संकलित करने के लिए
main : main.o a.o
g++ main.o a.o -o main
main.o : main.cpp
g++ -c main.cpp
a.o : a.cpp
g++ -c a.cpp
वीएस2012 पर भी काम करता है। – billz
मैंने किया और मैंने आदेश बदल दिया क्योंकि देजन ने – billz
@jogojapan - +1 का उल्लेख किया था। मैंने अपनी टिप्पणी हटा दी है जिसमें कहा गया है कि यह clang32 और gcc48 के साथ संकलित है। यह किसी भी कंपाइलर के साथ ठीक से संकलित था और किसी भी आदेश के साथ यदि तीन फाइलों की सामग्री को एक फ़ाइल में काट दिया गया था और चिपकाया गया था - जैसे मैंने शुरुआत में अपने परीक्षण के लिए किया था। डिज़न ने मेकफ़ाइल पोस्ट करने के बाद, मैं किसी भी संस्करण के क्लैंग और जीसीसी के साथ त्रुटि पुन: उत्पन्न करने में सक्षम था। –