我正在尝试在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 => long
和unsigned sth => int
是等价的(都是转换)。所以没有赢家,都是输家,这会导致编译错误。
如果您只是想避免编译错误,将intptr_t
转换为long
会有所帮助。但我认为最好的方法是使用合适的字体来代表它的意思。例如,如果它是一个地址,那么只需在开头使用uintptr_t
,并使其成为一种惯例。