c++ - 错误:重载函数的调用不明确
问题描述
我正在尝试在 Windows 10 上使用 MinGW GCC 编译器编译ustl C++ 库。
由于这个答案,下面 C++ 标头中的第 41 行能够解决,但第 43 行有问题。我应该如何解决?
https://github.com/msharov/ustl/blob/master/fstream.h#L41
// int ioctl (const char* rname, int request, long argument = 0); // orig
int ioctl (const char* rname, int request, long argument = 0u);
inline int ioctl (const char* rname, int request, int argument) { return fstream::ioctl (rname, request, long(argument)); }
inline int ioctl (const char* rname, int request, void* argument) { return fstream::ioctl (rname, request, intptr_t(argument)); }
MinGW GCC 编译器 (10.3.0 (Rev5, Built by MSYS2 project)) 错误信息:
fstream.h:43:132: error: call of overloaded 'ioctl(const char*&, int&, uintptr_t)' is ambiguous
43 | inline int ioctl (const char* rname, int request, void* argument) { return fstream::ioctl (rname, request, uintptr_t(argument)); }
- 编辑:感谢您的提示。有了另一个答案,下面的代码对我有用:
https://github.com/msharov/ustl/blob/master/fstream.h#L43
// ... intptr_t(argument)); // orig
*((long*)(argument)));
解决方案
你可以在最后几句话中找到
fstream.h:43:132: 错误: 重载 'ioctl(const char*&, int&, uintptr_t)' 的调用不明确 43 | inline int ioctl (const char* rname, int request, void* argument) { return fstream::ioctl (rname, request, uintptr_t
(argument)); }
intptr_t
实际上是uintptr_t
在你的环境中。至于uintptr_t
,你可以在cppreference中找到它是一个无符号整数。
根据重载决议中隐式转换序列的排名,是等价的(两者转换)。所以没有赢家,都是输家,这会导致编译错误。unsigned sth => long
unsigned sth => int
如果您只是想避免编译错误,请转换intptr_t
为long
帮助。但我认为最好的方法是使用代表其含义的正确类型。例如,如果它用于地址,则只需uintptr_t
在开头使用,并使其成为约定。
推荐阅读
- c# - 在 Combobox 1 (C#. NET) 上选择项目时显示 Combobox 2 列表
- android - 当系统的 WebView 是 Chrome 或 Android 系统 WebView(均为 84 版)时,无法在基于 WebView 的应用程序上获取 uiautomator 转储
- android - Flutter 应用中的半透明覆盖,以调试模式安装在物理 android 设备中
- django - 为什么我的 Django 网站出现网络错误?
- c++ - 向量下标超出范围线 1501
- windows - 如果 Windows 注册表项不存在,是否会使用默认值?
- node.js - mongoose Model.create 挂起,没有错误消息
- javascript - 我如何在 REACT-NATIVE 中做到这一点?[笔记本]
- python - 解析电子邮件数据中的子字符串
- python - 如何在python中处理一个非常大的文件?