Есть две ошибки:
- Доступ к псевдонимам частного типа
- Неоднозначная ссылка на псевдонимы типа
private-private
Я не вижу проблемы в том, что компилятор сначала жалуется на вторую проблему, потому что порядок на самом деле не имеет значения - чтобы продолжить, нужно исправить обе проблемы.
publi c -publi c
Если вы измените видимость MultiCmdQueueCallback::NetworkPacket
и PlcMsgFactoryImplCallback::NetworkPacket
на publi c или защищенный, тогда вторая проблема (неоднозначность) очевидна - это два псевдонима разных типов, хотя они имеют одинаковые базовые данные тип. Некоторые могут подумать, что «умный» компилятор может решить эту проблему (конкретный случай), но имейте в виду, что компилятор должен «мыслить в общем» и принимать решения, основанные на глобальных правилах, вместо того, чтобы указывать случай c исключения. Представьте себе следующий случай:
class MultiCmdQueueCallback {
using NetworkPacketID = size_t;
// ...
};
class PlcMsgFactoryImplCallback {
using NetworkPacketID = uint64_t;
// ...
};
Должен ли компилятор обрабатывать оба NetworkPacketID
одинаково? Точно нет. Потому что в 32-битной системе size_t
имеет длину 32 бита, а uint64_t
всегда 64-битную. Но если мы хотим, чтобы компилятор проверял базовые типы данных, он не мог бы различить guish в 64-битной системе.
publi c -private
Я считаю, что этот пример не имеет смысла в сценарии использования OP, но, поскольку здесь мы решаем проблемы в целом, давайте рассмотрим следующее:
class MultiCmdQueueCallback {
private:
using NetworkPacket = Networking::NetworkPacket;
// ...
};
class PlcMsgFactoryImplCallback {
public:
using NetworkPacket = Networking::NetworkPacket;
// ...
};
Я думаю, что в этом случае компилятор должен обработать PlcNetwork::NetworkPacket
как PlcMsgFactoryImplCallback::NetworkPacket
, потому что у него нет другого выбора. Почему он до сих пор отказывается это сделать и обвиняет в неопределенности, для меня загадка.