मुझे ऐसी लाइब्रेरी से निपटना है जिसमें कई टेम्पलेटेड क्लासेस शामिल हैं, जो निश्चित रूप से हेडर फाइलों में लागू होते हैं। अब मैं असहनीय लंबे संकलन समय को कम करने का एक तरीका खोजने की कोशिश कर रहा हूं जो इस तथ्य से आती है कि मुझे प्रत्येक में और मेरी संकलन इकाइयों में से एक में पूरी लाइब्रेरी शामिल करना है।टेम्पलेट्स: संकलन समय को कम करने के लिए आगे की घोषणाओं का उपयोग करें?
टेम्पलेट्स के बावजूद आगे की घोषणाओं का एक संभावित उपयोग कर रहा है? मैं नीचे दिए गए उदाहरण की तर्ज पर कुछ कोशिश कर रहा हूं, जहां मैंने #include <vector>
को एक उदाहरण के रूप में प्राप्त करने का प्रयास किया, लेकिन यह मुझे एक लिंकर त्रुटि दे रहा है क्योंकि push_back
अपरिभाषित है।
#include <iostream>
namespace std {
template<class T>
class vector {
public:
void push_back(const T& t);
};
}
int main(int argc, char** argv) {
std::vector<int>* vec = new std::vector<int>();
vec->push_back(3);
delete vec;
return EXIT_SUCCESS;
}
$ g++ fwddecl.cpp
ccuqbCmp.o(.text+0x140): In function `main':
: undefined reference to `std::vector<int>::push_back(int const&)'
collect2: ld returned 1 exit status
मैं precompiled हेडर एक बार कोशिश की, लेकिन वह सब पर संकलन बार परिवर्तन नहीं किया (मुझे यकीन है कि वे वास्तव में असली हेडर के बजाय लाद दिए गए कर देते थे)। लेकिन अगर आप सभी कहते हैं कि प्रीकंपिल्ड हेडर को जाने का रास्ता होना चाहिए तो मैं इसे फिर से कोशिश करूंगा।
अद्यतन: कुछ लोग कहते हैं कि एसटीएल कक्षाओं को आगे बढ़ाने की घोषणा करना उचित नहीं है। मुझे तनाव होना चाहिए कि ऊपर एसटीएल vector
सिर्फ एक उदाहरण था। मैं वास्तव में एसटीएल कक्षाओं को घोषित करने की कोशिश नहीं कर रहा हूं, लेकिन यह कुछ लाइब्रेरी के अन्य, भारी टेम्पलेट वर्गों के बारे में है जिन्हें मुझे उपयोग करना है।
अद्यतन 2: क्या उपर्युक्त उदाहरण वास्तव में संकलित और ठीक से लिंक करने का कोई तरीका है? लोगान -fno-implicit-templates
का उपयोग करने का सुझाव देते हैं और template class std::vector<int>
कहीं भी डालते हैं, संभावित रूप से .cpp
फ़ाइल में जो -fno-implicit-templates
के साथ संकलित हो जाता है, लेकिन मुझे अभी भी लिंकर त्रुटियां मिलती हैं। दोबारा, मैं यह समझने की कोशिश कर रहा हूं कि यह std::vector
के लिए कैसे काम करता है ताकि मैं इसे उन templated कक्षाओं पर लागू कर सकूं जो मैं वास्तव में उपयोग कर रहा हूं।
, आप आगे कुछ भी घोषित नहीं किया है। आपने जो कुछ किया है वह नामस्थान std में वेक्टर नामक एक टेम्पलेट वर्ग बना था। फिर आप उस पुश_बैक विधि को परिभाषित करने में विफल रहे जो आपने इसमें घोषित किया था। इसलिए लिंकर त्रुटि। –
दूसरा इवान का स्पष्टीकरण क्यों आगे घोषित करना std :: vector काम नहीं कर रहा है (आप कोण ब्रैकेट के अंदर कम से कम एक तर्क खो रहे हैं)। अपने द्वारा लिखे गए टेम्पलेट वर्ग का उपयोग करने का प्रयास करें, जिसे आप जानते हैं कि कोई डिफ़ॉल्ट टेम्पलेट तर्क नहीं है। –