চিত্র 1: ফাংশন টেম্পলেট
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
এটি কি ব্যবহারের সঠিক উপায় extern template
, বা আমি চিত্র 2 এর মতো কেবল শ্রেণিবদ্ধ টেম্পলেটগুলির জন্য এই কীওয়ার্ডটি ব্যবহার করব?
চিত্র 2: শ্রেণি টেম্পলেট
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
আমি জানি যে এই সমস্তগুলি একটি হেডার ফাইলে রাখা ভাল, তবে আমরা যদি একাধিক ফাইলে একই পরামিতিগুলির সাহায্যে টেম্পলেটগুলি ইনস্ট্যান্ট করি তবে আমরা একাধিক একই সংজ্ঞা পেয়েছি এবং সংকলক ত্রুটিগুলি এড়ানোর জন্য সেগুলি সমস্ত (একটি ব্যতীত) সরিয়ে ফেলবে। আমি কীভাবে ব্যবহার করব extern template
? আমরা কি এটি কেবল ক্লাসের জন্য ব্যবহার করতে পারি, বা আমরা এটি কার্যকারিতার জন্যও ব্যবহার করতে পারি?
এছাড়াও চিত্র 1 এবং চিত্র 2 এমন একটি সমাধানে প্রসারিত হতে পারে যেখানে টেমপ্লেটগুলি একক শিরোলেখ ফাইলের মধ্যে থাকে। সেক্ষেত্রে extern template
একাধিক একই তাত্ক্ষণিক ঘটনা এড়াতে আমাদের কীওয়ার্ডটি ব্যবহার করতে হবে। এটি কি কেবল ক্লাস বা ফাংশনগুলির জন্য?
extern template class foo<int>();
একটি ভুল মত মনে হচ্ছে।
()
এটি স্থিরও করি তবে এটি বাহ্যিক লাইনের নিকটে 'প্রত্যাশিত অযোগ্য-আইডি' বলেছে । আপনার বই এবং ভিজ্যুয়াল স্টুডিও উভয়ই ভুল, আরও বেশি স্ট্যান্ডার্ড কমপ্লায়েন্ট কম্পাইলার যেমন জি ++ বা ক্ল্যাং ব্যবহার করার চেষ্টা করুন এবং আপনি সমস্যাটি দেখতে পাবেন।