error: call of overloaded function ambiguous

error: call of overloaded function ambiguous

我正在尝试在 Windows 10 上使用 MinGW GCC 编译器编译 ustl C++ 库。

下面C++头文件中的第41行可以解决感谢this answer,但是第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,由 MSYS2 项目构建))错误消息:

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)); }

-- 编辑:感谢提示。 使用 another answer,下面的代码对我有用:

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(参数) ); }

intptr_t 实际上是您环境中的 uintptr_t。至于uintptr_t,你可以在cppreference中找到它是一个无符号整数。

根据ranking of implicit conversion sequence in overload resolutionunsigned sth => longunsigned sth => int是等价的(都是转换)。所以没有赢家,都是输家,导致编译错误。

如果您只是想避免编译错误,将 intptr_t 转换为 long 会有所帮助。但我认为最好的方法是使用代表其含义的适当类型。例如,如果是一个地址,那么就在开头使用uintptr_t,并使其成为一个约定。