Я пытаюсь взять указатель на экземпляр шаблона функции и преобразовать его в void *:
#include <stdio.h>
void plainFunction(int *param) {}
template <typename T>
void templateFunction(T *param) {}
int main() {
void *addr1=&plainFunction; //OK
void *addr2=&templateFunction<int>; //Compile error
}
Я получаю следующую ошибку (в Visual Studio 2008)
main.cu(10) : error C2440: 'initializing' : cannot convert from 'void (__cdecl *)(T *)' to 'void *'
Context does not allow for disambiguation of overloaded function
Почему это происходит? Функция templateFunction
(для конкретного типа T = int
) не перегружена. Можно определить, какой экземпляр функции я ссылаясь на.
Если я заменю строку с ошибкой на:
void (*foo)(int*)=&templateFunction<int>;
void *addr2=foo;
Она компилируется без проблем.
Спасибо!
Обновление:
При замене обычного указателя void *
указателем на фиктивную функцию void (*) ()
, как было предложено Джеймсом (спасибо), он устраняет ошибку:
void (*addr1)()=(void(*)())&plainFunction;
void (*addr2)()=(void(*)())(&templateFunction<int>);
Однако, если ошибка была вызвана приведением указателя на функцию к обычный указатель, компилятор sh Я могу пожаловаться в обоих случаях. Однако это не так, поэтому я продолжаю предполагать, что это правильно, по крайней мере, для этого компилятора. Если я не ошибаюсь, стандарт просто говорит, что указатели функций не должны представляться как обычные указатели, но он не запрещает этого.