c++ - 直接从指针转换为模板函数?

标签 c++ visual-c++

我正在尝试获取指向函数模板实例的指针并将其转换为 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(*)() 替换时,正如 James 所建议的(谢谢),它会使错误消失:

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

但是,如果错误是由将函数指针转换为普通指针引起的,则编译器在这两种情况下都应该报错。但是它没有,所以我继续假设它至少对于这个编译器是正确的。如果我没记错的话,标准只是说函数指针不必必须像普通指针一样表示,但它并不禁止这样做。

最佳答案

两者在技术上都是错误的:在 C++ 中,您不能将函数指针转换为 void*

指向函数的指针类型(如 void (*)(int*) 这里)与指向对象的指针类型(如 void* 这里)。

Visual C++ 完全允许转换(例如在 void* addr1 = &plainFunction; 中)是一种语言扩展(使用 /Za 标志编译,它禁用语言扩展, 导致这两行都被拒绝)。

当然,该错误有点误导,尽管其他一些编译器同样没有帮助(Comeau 报告“错误:函数模板“templateFunction”的实例与所需类型不匹配”)。

关于c++ - 直接从指针转换为模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5277547/

相关文章:

c++ - 在 async_read 处理程序在服务器中返回错误后调用 boost::asio::tcp::socket 方法

visual-studio - 将外部 header 添加到 Visual Studio 项目

c++ - ADO 不支持存储过程中的 XML

C++11 继承构造函数和访问修饰符

c# - 从 C# 调用 C++/CLI 代码

C++ const_iterator 不可取消引用?

c++ - 在头文件中使用 C++ 'using' 关键字有错吗?

c++ - 使用 try-Catch 异常处理程序和 if else 条件检查之间的区别?

c++ - 向字符串中插入一个字符

c++ - 使用动态菜单的命令范围