Bir şablon işaretçisi olarak işlev işaretçisi bir dizi bir işlev işaretçisi geçmek istiyorum. Intellisense bir şeylerin yanlış olduğundan şikayetçi olsa bile kodum MSVC kullanarak derleniyor. Hem gcc hem de clang kodu derleyememektedir.
Aşağıdaki örneği düşünün:
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?
}
MSVC kodu derler, ancak Intellisense aşağıdaki hatayı verir:invalid nontype template argument of type "const FunctionPointer"
gcc aşağıdaki mesajla derlenemez:
<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
clang aşağıdaki mesajla derlenemez:
<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.
Sorular:
Mi wrapper_function<functions[0]>();
geçerli veya olmasın?
Değilse, functions[0]
şablon argümanı olarak geçmek için yapabileceğim bir şey var wrapper_function
mı? Amacım, derleme zamanında içerikle birlikte yeni bir işlev işaretçileri dizisi oluşturmak { wrapper_function<functions[0]>, ..., wrapper_function<functions[std::size(functions) - 1]> }
.
wrapper_function<decltype(functions[0])>()
derlemiyor bile .