Прямое приведение указателя к шаблонной функции?

Я пытаюсь взять указатель на экземпляр шаблона функции и преобразовать его в 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 Я могу пожаловаться в обоих случаях. Однако это не так, поэтому я продолжаю предполагать, что это правильно, по крайней мере, для этого компилятора. Если я не ошибаюсь, стандарт просто говорит, что указатели функций не должны представляться как обычные указатели, но он не запрещает этого.

5
задан luke 11 March 2011 в 20:32
поделиться