受保护的嵌套结构不能用作派生外部 Class 中的 Return 类型?

Protected Nested Struct Cannot Be Used As Return Type in Derived Outer Class?

我有以下class(简体)

基础 Class - ExchangeGatewayUDSHandler.h

    class ExchangeGatewayUDSHandler : public Instrument::IInstrumentListener
    {
    public:

        explicit ExchangeGatewayUDSHandler(const EGUDSConfig& config);
        virtual ~ExchangeGatewayUDSHandler();

        void ProcessEnqueue(UDSRequest& udsRequest);

    protected:

        struct UDSValidityInfo
        {
        public:
            UDSValidityInfo() = default;

            void SetValidity(const bool validity) { isValid_ = validity; }
            void SetReason(const char* reason) { reason_ = reason; }
            inline const std::string GetReason() const { return reason_; }
            inline const bool GetValidity() const { return isValid_; }

        private:
            bool isValid_;
            std::string reason_;
        };

        virtual UDSValidityInfo UDSRequestIsValid(const UDSRequest& udsReq) { return {}; }
   };

如您所见,UDSValidityInfo 是一个嵌套结构。它只会在 ExchangeGatewayUDSHandler 及其所有派生的 class 中创建。唯一的问题是,出于某种原因,在派生的 CPP 文件中 class ExchangeGatewayICEUDSHandler 我不能 return UDSValidityInfo.

派生 Class - ExchangeGatewayICEUDSHandler.h

    class ICEGatewayUDSHandler: public ExchangeGatewayUDSHandler
    {
    public:

        ICEGatewayUDSHandler(const ExchangeGatewayUDSHandlerConfig& config);

    protected:

        virtual UDSValidityInfo UDSRequestIsValid(const UDSRequest& udsReq) override; // No error

    };

派生 Class - ExchangeGatewayICEUDSHandler.cpp

    ICEGatewayUDSHandler::ICEGatewayUDSHandler(const ExchangeGatewayUDSHandlerConfig& config)
        :   ExchangeGatewayUDSHandler(config) {};

    // Error in return type
    UDSValidityInfo ICEGatewayUDSHandler::UDSRequestIsValid(const UDSRequest& udsReq) 
    {
        UDSValidityInfo validityObject{}; // No error creating the struct here.
        validityObject.SetValidity(true);

        if (udsReq.legs_.empty())
        {
            validityObject.SetReason("The UDS contains no legs.");
            validityObject.SetValidity(false);
        }

        return validityObject;
    }

Visual Studio 19 表示错误是:

Identifier "UDSValidityInfo" is unidentified

我也得到函数类型错误 (virtual UDSValidityInfo UDSRequestIsValid(const UDSRequest& udsReq) override;),即使在 .h 文件(声明它的地方)中这个函数没有错误,说这两个函数是不兼容。

我不确定为什么会这样。当我将结构设为静态时,问题就消失了,但我认为这是作弊。

谢谢。

ExchangeGatewayUDSHandlerICEGatewayUDSHandler class 声明之外的 .cpp 文件中,您需要在方法 [=26= 中限定 UDSValidityInfo ] 值以便编译器知道在哪里寻找该类型,因为它还没有看到 ExchangeGatewayUDSHandler::ICEGatewayUDSHandler:: 限定符,例如:

ExchangeGatewayUDSHandler::UDSValidityInfo ICEGatewayUDSHandler::UDSRequestIsValid(const UDSRequest& udsReq) 
{
    ...
}

或者,您可以使用带有尾随 return 类型的 auto,这样编译器将在看到 [=] 之前看到 ExchangeGatewayUDSHandler::ICEGatewayUDSHandler:: 限定符14=] 类型,因此将知道查找它的正确范围,例如:

auto ICEGatewayUDSHandler::UDSRequestIsValid(const UDSRequest& udsReq) -> UDSValidityInfo
{
    ...
}