Я пытаюсь взять указатель на экземпляр шаблона функции и привести его к 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
) не перегружена.Можно определить, к какому экземпляру функции я обращаюсь.
Если заменить строку erroneus на:
void (*foo)(int*)=&templateFunction<int>;
void *addr2=foo;
Она компилируется без проблем.
Спасибо!
Обновление:
Когда нормальный указатель void*
заменяется на фиктивный указатель на функцию void(*)()
, как предложил Джеймс (спасибо), это устраняет ошибку:
void (*addr1)()=(void(*)())&plainFunction;
void (*addr2)()=(void(*)())(&templateFunction<int>);
Однако, если ошибка была вызвана приведением указателя на функцию к обычному указателю, компилятор должен пожаловаться в обоих случаях.Однако это не так, поэтому я продолжаю предполагать, что это правильно по крайней мере для этого компилятора.Если я не ошибаюсь, стандарт просто говорит, что указатели на функции не должны представляться как обычные указатели, но это не запрещает это.