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