我正在将方言设置为C ++ 17的int = 32位(gcc arm none eabi,cortex M3,GCC版本9)的平台上进行编译。
我有一个方法的重载,该方法同时具有相同方法的模板版本和普通版本。正常的重载在私有基类中,但已通过using子句公开。
class MemoryStream {
public:
inline void write(bool value);
inline void write(uint8_t value);
inline void write(uint16_t value);
inline void write(uint32_t value);
inline void write(int16_t value);
inline void write(int32_t value);
}
和
class WriteStream :private MemeoryStream {
public:
using MemoryStream::write;
template<typename T>
typename std::enable_if<std::is_integral<T>::value>::type WriteStream::write(T obj){
MemoryStream::write(obj);
}
}
[当我使用数字文字调用方法时,]
txStream.write(0U);
我收到以下错误:
In instantiation of 'typename std::enable_if<std::is_integral<_Tp>::value>::type WriteStream::write(T) [with T = unsigned int; typename std::enable_if<std::is_integral<_Tp>::value>::type = void]':
error: call of overloaded 'write(unsigned int&)' is ambiguous
1。)为什么没有选择普通的重载函数,因为它们是通过using子句导入的,如果我调用
txStream.write<uint32_t>(0U);
或
constexpr uint32_t Zero =0;
txStream.write<uint32_t>(Zero);
他们解决没有错误?
unsigned int是否与uint32_t不同?
2。)编译器为何将数字文字转换为引用?如错误消息所示:'重载调用(无符号int&)的调用不明确'
unsigned int
是与固定宽度类型不同的类型(即使其中一个使用类型固定的类型与unsigned int
的大小相同),因此对于您的代码,编译器不知道write
的重载]应该被调用。
您需要为unsigned int
和int
提供重载。
考虑如果在具有32位int的一个系统上调用write(uint32_t)
,而在具有16位int的另一系统上,则调用write(uint16_t)
(或替代)会出现的问题“ 64”代表“ 16”)。或相应的混乱,如果一个系统将写入32位数字,而另一个系统将读取不同大小的数字。