मुझे समझ में नहीं आ रहा है, क्यों हम हेडर में सामान्य (गैर-टेम्पलेट) कक्षा के स्थैतिक चर को परिभाषित करते हैं, हमारे पास लिंकर त्रुटि है, लेकिन टेम्पलेट्स के मामले में सभी ठीक काम करते हैं और इसके अलावा हमारे पास एक ही उदाहरण होगा सभी अनुवाद इकाइयों के बीच स्थिर चर:टेम्पलेट स्थिर चर
यह टेम्पलेट हैडर (template.h) है:
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
यह पहली इकाई टेम्पलेट का उपयोग कर (unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
दूसरा इकाई है वह फिर से (unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
और अंत में, main.cpp:
0
1
:
// main.cpp
#include <iostream>
int method1();
int method2();
int main(int argc, char** argv) {
std::cout << method1() << std::endl;
std::cout << method2() << std::endl;
}
, compilling जोड़ने और इस कोड को क्रियान्वित करने के बाद, हम उत्पादन निम्नलिखित होगा
तो, क्यों टेम्पलेट्स के मामले में सभी ठीक काम करते हैं (और अपेक्षित के रूप में)? कैसे कंपाइलर या लिंकर इसे संभालते हैं (हम प्रत्येक .cpp फ़ाइल को संकलक के अलग-अलग कॉलिंग में संकलित कर सकते हैं, और फिर उन्हें लिंकर से कैलिंग के साथ लिंक कर सकते हैं, इसलिए कंपाइलर और लिंकर एक ही समय में सभी .cpp फ़ाइलों को "देखें" नहीं देखते हैं)?
पुनश्च: मेरे संकलक: msvcpp 9 (लेकिन MinGW पर भी चेक किए गए)
यदि आप हमें वह कोड दिखाते हैं जो ** ** काम नहीं करता है तो यह अधिक उपयोगी होगा। – JesperE
मुझे लगता है कि कोड जो काम नहीं करता है वह वह है जहां आप एक शीर्षलेख में एक चर परिभाषित करते हैं जो एक से अधिक फ़ाइल (बाहरी नहीं) में शामिल हो जाता है, जिसके परिणामस्वरूप नामकरण टकराव होता है। – falstro