【发布时间】:2020-05-27 20:24:50
【问题描述】:
我有两个带有 using 子句的基类
class MultiCmdQueueCallback {
using NetworkPacket = Networking::NetworkPacket;
....
}
class PlcMsgFactoryImplCallback {
using NetworkPacket = Networking::NetworkPacket;
....
}
然后我声明一个类
class PlcNetwork :
public RouterCallback,
public PlcMsgFactoryImplCallback,
public MultiCmdQueueCallback {
private:
void sendNetworkPacket(const NetworkPacket &pdu);
}
然后编译器标记一个错误引用 'NetworkPacket' is ambiguous 'sendNetworkPacket(NetworkPacket &... '
现在两个“使用子句”都解析为同一个底层类 Networking:NetworkPacket
事实上,如果我将方法声明替换为:
void sendNetworkPacket(const Networking::NetworkPacket &pdu);
它编译得很好。
为什么编译器将每个 using 子句视为不同的类型,即使它们都指向相同的底层类型。这是标准规定的还是我们有编译器错误?
【问题讨论】:
-
编译器好像不够聪明
-
关键是编译器此时只知道存在三个
NetworkPacket- 在 MultiCmdQueueCallback 中,在 PlcMsgFactoryImplCallback 中,在 Networking 中。应该指定使用哪一个。而且我不认为在这里输入virtual会有任何帮助。 -
@idris:相反,您的意思是标准不够宽松。编译器遵循标准是正确的。
-
@Jarod42 在下面的答案中,“类型 ID 表示的类型的同义词”因此如果它们具有相同的类型 ID,则可以允许两者同时使用。无论是标准还是编译器,似乎有些人实际上还不够聪明。
-
多继承的问题之一
标签: c++ using-declaration