受保护的嵌套结构不能用作派生外部 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 文件(声明它的地方)中这个函数没有错误,说这两个函数是不兼容。
我不确定为什么会这样。当我将结构设为静态时,问题就消失了,但我认为这是作弊。
谢谢。
在 ExchangeGatewayUDSHandler
和 ICEGatewayUDSHandler
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
{
...
}
我有以下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 文件(声明它的地方)中这个函数没有错误,说这两个函数是不兼容。
我不确定为什么会这样。当我将结构设为静态时,问题就消失了,但我认为这是作弊。
谢谢。
在 ExchangeGatewayUDSHandler
和 ICEGatewayUDSHandler
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
{
...
}