Eu tenho duas classes base com cláusulas de uso
class MultiCmdQueueCallback {
using NetworkPacket = Networking::NetworkPacket;
....
}
class PlcMsgFactoryImplCallback {
using NetworkPacket = Networking::NetworkPacket;
....
}
Declaro uma classe
class PlcNetwork :
public RouterCallback,
public PlcMsgFactoryImplCallback,
public MultiCmdQueueCallback {
private:
void sendNetworkPacket(const NetworkPacket &pdu);
}
o compilador sinaliza uma referência de erro para 'NetworkPacket' é ambígua 'sendNetworkPacket (NetworkPacket & ...'
Agora, ambas as 'cláusulas de uso' resolvem a mesma classe subjacente Rede: NetworkPacket
e, de fato, se eu substituir a declaração do método por:
void sendNetworkPacket(const Networking::NetworkPacket &pdu);
compila bem.
Por que o compilador trata cada cláusula de uso como um tipo distinto, embora ambos apontem para o mesmo tipo subjacente. Isso é obrigatório pelo padrão ou temos um bug do compilador?
NetworkPacket
- no MultiCmdQueueCallback, em PlcMsgFactoryImplCallback, em Rede. Qual usar deve ser especificado. E eu não acho que colocar virtual
aqui será de alguma ajuda.