I am trying to take a pointer to an instance of function template and cast it to void*:
#include
void plainFunction(int *param) {}
template
Both are technically wrong: in C++, you can't convert a function pointer to a void*.
Pointer-to-function types (like void (*)(int*) here) are a completely different class of types than pointer-to-object types (like void* here).
Visual C++ allowing the conversion at all (e.g. in void* addr1 = &plainFunction;) is a language extension (compiling with the /Za flag, which disables language extensions, causes both lines to be rejected).
The error is a bit misleading, for sure, though some other compilers are equally unhelpful (Comeau reports "error: no instance of function template "templateFunction" matches the required type").