我试图获取指向函数模板实例的指针并将其转换为 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;
它编译没有问题。
谢谢你!
Update:
当指针正常时void*
被虚拟函数指针取代void(*)()
,按照詹姆斯的建议(谢谢),它使错误消失:
void (*addr1)()=(void(*)())&plainFunction;
void (*addr2)()=(void(*)())(&templateFunction<int>);
但是,如果错误是由将函数指针转换为普通指针引起的,则编译器在这两种情况下都应该抱怨。然而事实并非如此,所以我继续假设它至少对于这个编译器来说是正确的。如果我没记错的话,标准只是说函数指针不have to可以像普通指针一样表示,但并不禁止这样做。
两者在技术上都是错误的:在 C++ 中,你不能将函数指针转换为void*
.
函数指针类型(例如void (*)(int*)
这里)是与指向对象类型的指针完全不同的类型(例如void*
here).
Visual C++ 完全允许转换(例如在void* addr1 = &plainFunction;
)是一个语言扩展(用/Za
标志,禁用语言扩展,导致两行都被拒绝)。
当然,这个错误有点误导,尽管其他一些编译器同样没有帮助(Comeau 报告“错误:没有函数模板“templateFunction”的实例与所需类型匹配”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)