নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন।
#include <iostream>
template <typename T>
void f( void ( *fn )( T ) )
{
fn( 42 );
}
void g( int x )
{
std::cout << "g( " << x << " );\n";
}
int main()
{
f( g );
}
প্রোগ্রামটি সফলভাবে সংকলন করে এবং এর আউটপুট হয়
g( 42 );
এখন অ টেমপ্লেট ফাংশন নামান্তর দিন g
থেকে f
।
#include <iostream>
template <typename T>
void f( void ( *fn )( T ) )
{
fn( 42 );
}
void f( int x )
{
std::cout << "f( " << x << " );\n";
}
int main()
{
f( f );
}
এখন প্রোগ্রামটি gcc হেড 10.0.0 20200 দ্বারা সংকলিত হয়নি এবং ঝনঝন হেড 10.0.0 দ্বারা নয় তবে ভিজ্যুয়াল সি ++ 2019 দ্বারা সাফল্যের সাথে সংকলিত হয়েছে ..
উদাহরণস্বরূপ সংকলক জিসিসি নিম্নলিখিত বার্তাগুলির সেট জোগায়।
prog.cc: In function 'int main()':
prog.cc:22:10: error: no matching function for call to 'f(<unresolved overloaded function type>)'
22 | f( f );
| ^
prog.cc:4:6: note: candidate: 'template<class T> void f(void (*)(T))'
4 | void f( void ( *fn )( T ) )
| ^
prog.cc:4:6: note: template argument deduction/substitution failed:
prog.cc:22:10: note: couldn't deduce template parameter 'T'
22 | f( f );
| ^
prog.cc:14:6: note: candidate: 'void f(int)'
14 | void f( int x )
| ^
prog.cc:14:13: note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'int'
14 | void f( int x )
| ~~~~^
সুতরাং একটি প্রশ্ন ওঠে: কোডটি সংকলন করা উচিত এবং কী কারণে কোডটি জিসিসি এবং ঝনঝন দ্বারা সংকলিত হয়নি?
g
(পরিবর্তে &g
) পাস করার ফলে টাইপ ক্ষয় হয় (একটি ফাংশন অবলম্বন রেফারেন্স একটি ফাংশনের দিকে নির্দেশকের ক্ষয়ে যায়: void(&)(T)
=> void(*)(T)
)। এই প্রকৃত রূপান্তরটি ঘটে কারণ f
আরও ভাল কোনও মিলের সাথে আর কোনও ওভারলোড নেই । দ্বিতীয় উদাহরণে, একটি দ্ব্যর্থতা আছে যা f
আপনি আসলে কল করতে চান কারণ ... এটি জানে না কোনটি f
যুক্তি।