В вашем коде есть несколько проблем.
В вашем коде при вызове _draw
параметры SourceFormat
и DestFormat
шаблона _draw
предоставляются с явными аргументами. Эти аргументы являются простыми не ссылочными целочисленными типами. Это автоматически означает, что третий параметр шаблона _draw
должен быть функцией, которая также принимает свои аргументы по значению. То есть если SourceFormat
и DestFormat
равны unsigned __int32
, указатель функции должен иметь тип void (*)(unsigned __int32, unsigned __int32)
. Вместо этого вы пытаетесь предоставить функцию, которая принимает аргументы по ссылке, то есть тип указателя - void (*)(unsigned __int32 &, unsigned __int32 &)
. Это абсолютно нереализованные и несовместимые типы указателей. Следующий простой код не сможет скомпилироваться по той же причине
void foo(int&);
void (*pf)(int) = foo;
// ERROR: a value of type "void (*)(int &)" cannot be used to initialize an entity of type "void (*)(int)"
Как вы ожидаете, что это сработает? Либо удалите ссылки из фактических параметров функции (используйте вместо этого возвращаемый тип), либо добавьте их в объявление параметров шаблона.
Другая проблема заключается в том, что вы пытаетесь использовать указатели на static
функции (внутренняя связь) для параметризации шаблона. Это незаконно в C ++. Короткий пример, иллюстрирующий проблему, может выглядеть следующим образом
template <void (*P)()> void foo() {}
static void bar() {}
...
foo<bar>();
// ERROR: template argument may not reference a non-external entity
Если вы хотите параметризовать шаблон значением указателя, аргумент, который вы предоставляете, должен указывать на сущность с внешней связью. Ваш компилятор может разрешить то, что вы сделали, как есть, но это все еще незаконно.
Наконец, в C ++ запрещено заканчивать определение автономной функции точкой с запятой. На самом деле это рассматривается как «пустое объявление», и в C ++ нет «пустых объявлений». Многие компиляторы допускают это, но это все еще незаконно.
P.S. Кроме того, как уже отмечали другие, вам удалось изменить порядок типов параметров в функции преобразования без шаблонов convertARGB_GREY
.