আমি টেমপ্লেট ফাংশনগুলি সম্পর্কে পড়ছিলাম এবং এই সমস্যায় বিভ্রান্ত হয়ে পড়েছিলাম:
#include <iostream>
void f(int) {
std::cout << "f(int)\n";
}
template<typename T>
void g(T val) {
std::cout << typeid(val).name() << " ";
f(val);
}
void f(double) {
std::cout << "f(double)\n";
}
template void g<double>(double);
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // d f(int), this is surprising
g(1); // i f(int)
}
আমি না লিখলে ফলাফল একই হয় template void g<double>(double);
।
আমি মনে করি g<double>
পরে instantiated দিতে হবে f(double)
, সেইজন্য এবং কল f
মধ্যে g
কল করা উচিত f(double)
। আশ্চর্যজনকভাবে, এটি এখনও কল f(int)
করে g<double>
। কেউ কি আমাকে এটি বুঝতে সাহায্য করতে পারে?
উত্তরগুলি পড়ার পরে, আমি বুঝতে পারি যে আমার বিভ্রান্তি আসলে কী।
এখানে একটি আপডেট উদাহরণ। এটির জন্য আমি একটি বিশেষীকরণ যুক্ত করেছি তা ছাড়া এটি বেশিরভাগ অপরিবর্তিত রয়েছে g<double>
:
#include <iostream>
void f(int){cout << "f(int)" << endl;}
template<typename T>
void g(T val)
{
cout << typeid(val).name() << " ";
f(val);
}
void f(double){cout << "f(double)" << endl;}
//Now use user specialization to replace
//template void g<double>(double);
template<>
void g<double>(double val)
{
cout << typeid(val).name() << " ";
f(val);
}
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // now d f(double)
g(1); // i f(int)
}
ব্যবহারকারী বিশেষায়নের সাথে, g(1.0)
আমার প্রত্যাশা অনুযায়ী আচরণ করে।
সংকলকটি স্বয়ংক্রিয়ভাবে g<double>
একই জায়গায় (একই কি সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ , চতুর্থ সংস্করণের ২ main()
26.৩.৩ অনুচ্ছেদে বর্ণিত হিসাবে একই ইনস্ট্যান্টেশনটি করা উচিত নয় )?
g(1)
দেয়i f(int)
। আপনি লিখেছেনd f(double)
। এটি কি টাইপো ছিল?