我有两个使用using子句的基类

 class MultiCmdQueueCallback {
  using NetworkPacket  = Networking::NetworkPacket;
  ....
 }


 class PlcMsgFactoryImplCallback {
   using NetworkPacket = Networking::NetworkPacket;
  ....
 }

然后我宣布一个类(class)
class PlcNetwork :
  public RouterCallback,
  public PlcMsgFactoryImplCallback,
  public MultiCmdQueueCallback {
  private:
    void sendNetworkPacket(const NetworkPacket &pdu);
}

然后,编译器会标记对“NetworkPacket”的错误引用是模糊的“sendNetworkPacket(NetworkPacket&...”

现在,两个“using子句”都解析为相同的基础类Networking:NetworkPacket

实际上,如果我将方法声明替换为:
 void sendNetworkPacket(const Networking::NetworkPacket &pdu);

它编译良好。

为什么编译器将每个using子句都视为不同的类型,即使它们都指向相同的基础类型也是如此。这是由标准规定的还是我们有编译器错误?

最佳答案

在查看别名结果类型(和可访问性)之前

我们来看的名字

的确,
NetworkPacket可能是

  • MultiCmdQueueCallback::NetworkPacket
  • PlcMsgFactoryImplCallback::NetworkPacket

  • 他们俩都指向Networking::NetworkPacket的事实是无关紧要的。

    我们进行名字解析,这导致歧义。

    09-04 07:26