了解解决函数重载的编译器选择

问题描述 投票:0回答:1

我正在将方言设置为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&)的调用不明确'

c++ gcc c++17 overload-resolution
1个回答
0
投票

unsigned int是与固定宽度类型不同的类型(即使其中一个使用类型固定的类型与unsigned int的大小相同),因此对于您的代码,编译器不知道write的重载]应该被调用。

您需要为unsigned intint提供重载。

考虑如果在具有32位int的一个系统上调用write(uint32_t),而在具有16位int的另一系统上,则调用write(uint16_t)(或替代)会出现的问题“ 64”代表“ 16”)。或相应的混乱,如果一个系统将写入32位数字,而另一个系统将读取不同大小的数字。

© www.soinside.com 2019 - 2024. All rights reserved.