我试图获取一个指向函数模板实例的指针,并将其转换为void*:
我在 Visual Studio 2008 中遇到了以下错误:
为什么会发生这种情况?函数
如果我用以下代码替换错误的行:
#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(*)()
替换时,正如James所建议的那样(谢谢),这将使错误消失:
void (*addr1)()=(void(*)())&plainFunction;
void (*addr2)()=(void(*)())(&templateFunction<int>);
然而,如果错误是由于将函数指针转换为普通指针引起的,则编译器应在两种情况下报错。但实际上它并没有,所以我继续假设至少对于这个编译器来说是正确的。如果我没有错,标准只是说函数指针不必像普通指针一样表示,但并没有禁止这样做。
void *
的转换是不允许的。请注意,使用您的更新,您不能通过void(*)()
调用任何一个函数,因为那不是任何一个函数的类型;您必须将addr1
或addr2
强制转换回正确的类型(void(*)(int*)
)才能进行调用,否则行为是未定义的。 - James McNellis