আমি টেমপ্লেট আর্গুমেন্ট হিসাবে ফাংশন পয়েন্টারগুলির একটি অ্যারে থেকে একটি ফাংশন পয়েন্টারটি পাস করতে চাই। আমার কোডটি এমএসভিসি ব্যবহার করে সংকলিত বলে মনে হচ্ছে যদিও ইন্টেলিসেন্স কিছু ভুল বলে অভিযোগ করেছে। জিসিসি এবং কলং উভয়ই কোডটি সংকলন করতে ব্যর্থ।
নিম্নলিখিত উদাহরণ বিবেচনা করুন:
static void test() {}
using FunctionPointer = void(*)();
static constexpr FunctionPointer functions[] = { test };
template <FunctionPointer function>
static void wrapper_function()
{
function();
}
int main()
{
test(); // OK
functions[0](); // OK
wrapper_function<test>(); // OK
wrapper_function<functions[0]>(); // Error?
}
এমএসভিসি কোডটি সংকলন করে তবে ইন্টেলিসেন্স নিম্নলিখিত ত্রুটিটি দেয়:invalid nontype template argument of type "const FunctionPointer"
gcc নিম্নলিখিত বার্তাটি সংকলন করতে ব্যর্থ:
<source>: In function 'int main()':
<source>:19:33: error: no matching function for call to 'wrapper_function<functions[0]>()'
19 | wrapper_function<functions[0]>(); // Error?
| ^
<source>:8:13: note: candidate: 'template<void (* function)()> void wrapper_function()'
8 | static void wrapper_function()
| ^~~~~~~~~~~~~~~~
<source>:8:13: note: template argument deduction/substitution failed:
<source>:19:30: error: '(FunctionPointer)functions[0]' is not a valid template argument for type 'void (*)()'
19 | wrapper_function<functions[0]>(); // Error?
| ~~~~~~~~~~~^
<source>:19:30: note: it must be the address of a function with external linkage
ঝনঝন নিম্নলিখিত বার্তাটি সংকলন করতে ব্যর্থ:
<source>:19:2: error: no matching function for call to 'wrapper_function'
wrapper_function<functions[0]>(); // Error?
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:8:13: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'function'
static void wrapper_function()
^
1 error generated.
প্রশ্নাবলী:
কি wrapper_function<functions[0]>();
বৈধ কি না?
যদি তা না হয়, তবে এখানে functions[0]
টেমপ্লেট যুক্তি হিসাবে পাস করার মতো আমি কি কিছু করতে পারি wrapper_function
? আমার লক্ষ্য বিষয়বস্তু সহ সংকলন সময়ে ফাংশন পয়েন্টারগুলির একটি নতুন অ্যারে তৈরি করা { wrapper_function<functions[0]>, ..., wrapper_function<functions[std::size(functions) - 1]> }
।
wrapper_function<decltype(functions[0])>()
সংকলন করে না।