首页 > 解决方案 > 错误:重载函数的调用不明确

问题描述

我正在尝试在 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))); 

标签: c++stlambiguous

解决方案


你可以在最后几句话中找到

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 => longunsigned sth => int

如果您只是想避免编译错误,请转换intptr_tlong帮助。但我认为最好的方法是使用代表其含义的正确类型。例如,如果它用于地址,则只需uintptr_t在开头使用,并使其成为约定。


推荐阅读