error:重载函数的调用有歧义



我正在尝试在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, build 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承办

// ... intptr_t(argument));  // orig
*((long*)(argument))); 

你可以在最后几个单词中发现

fstream.h: 43:32:错误:调用重载的'ioctl(const char*&, int&, uintptr_t)'是不明确的43 | inline int ioctl(const char* rname, int request, void* argument){返回fstream::ioctl (rname, request,uintptr_t(论点));}

intptr_t实际上是您环境中的uintptr_t。对于uintptr_t,您可以在cppreference中发现它是一个无符号整数。

根据重载解析隐式转换序列的排序,unsigned sth => longunsigned sth => int是等价的(都是转换)。所以没有赢家,都是输家,这会导致编译错误。

如果您只是想避免编译错误,将intptr_t转换为long会有所帮助。但我认为最好的方法是使用合适的字体来代表它的意思。例如,如果它是一个地址,那么只需在开头使用uintptr_t,并使其成为一种惯例。