कल्पना कीजिए कि आप एक फ़ाइल आहजी ++, कई टेम्प्लेट विशेषज्ञता के लिए लिंकर चेतावनी/त्रुटि की आवश्यकता होती है
#include <iostream>
template<typename T> struct A{
int magic;
A():magic(1234){}
void f(){std::cout<<"default f"<<magic<<std::endl;}
};
void f(A<int>* a);
तो समारोह च "a.cpp"
#include "a.h"
void f(A<int>* a){
a->f();
}
और अंत में परिभाषित किया गया है है, " main.cpp "टेम्पलेट माहिर हैं, और फिर च
#include "a.h"
template<> struct A<int>{
};
int main(){
A<int> a;
f(&a);
}
का उपयोग करता है जाहिर संकलक Ao के लिए गैर विशेष संस्करण का उपयोग करता है, और main.o के लिए विशेष संस्करण, यानी ए के दो अलग-अलग कार्यान्वयन होते हैं निष्पादन पर, एफ केवल कचरा/सेगफॉल्ट प्रिंट कर सकता है, क्योंकि ऑब्जेक्ट पास की गई उम्मीद से एक अलग संरचना होती है।
क्या लिंकर को चेतावनी देने का कोई तरीका है कि ए के दो संस्करण हैं?
यह हल करने में एक कठिन समस्या है, यही कारण है कि इसके लिए कोई अनिवार्य निदान नहीं है। – Flexo
एचटीएच: प्रश्न से सभी टेम्पलेट हटा दें - और आपके पास एक ही परिणाम होगा। स्ट्रक्चर ए के एएच में केवल आगे की घोषणा छोड़ दें; और इसे पूर्ण संस्करण को a.cpp पर ले जाएं। main.cpp - केवल खाका हटा ... – PiotrNycz