¿Transmitir directamente del puntero a una función de plantilla?

Intento tomar un puntero a una instancia de plantilla de función y convertirlo en nulo *:

#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
}

Recibo el siguiente error (en 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

¿Por qué está pasando? FuncióntemplateFunction (para hormigón tipoT=int) no está sobrecargado. Es posible deducir a qué instancia de la función me refiero.

Si reemplazo la línea errónea con:

void (*foo)(int*)=&templateFunction<int>;
void *addr2=foo;

Se compila sin problemas.

¡Gracias

Actualizar

Cuando el puntero normalvoid* se reemplaza por el puntero de función ficticiavoid(*)(), como lo sugirió James (gracias), hace que el error desaparezca:

void (*addr1)()=(void(*)())&plainFunction;
void (*addr2)()=(void(*)())(&templateFunction<int>);

Sin embargo, si el error fue causado al convertir un puntero de función en un puntero normal, el compilador debería quejarse en ambos casos. Sin embargo, no es así, así que sigo asumiendo que es correcto al menos para este compilador. Si no me equivoco, el estándar solo dice que los punteros de función noTiene qu ser representado como punteros normales, pero no lo prohíbe.

Respuestas a la pregunta(2)

Su respuesta a la pregunta