Рассмотрим следующий пример, который является частью более крупной кодовой базы, в getInstance(). Если я не возвращаю указатель на производный класс, т. е. просто void или int или другой тип, компиляция Это хорошо. Но я хочу вернуть указатель на производный тип. Все еще не уверены, в чем может быть проблема?
#include
#include
namespace mpc_local_planner {
// Base Abstract Class
class StageInequalityBase {
public:
using Ptr = std::shared_ptr;
virtual Ptr getInstance() const = 0; // Pure virtual function
virtual void somePureVirtualFunction() const = 0; // Another pure virtual function
virtual ~StageInequalityBase() = default; // Ensure a virtual destructor
};
// Intermediate Abstract Class
class IntermediateStageInequality : public StageInequalityBase {
public:
using Ptr = std::shared_ptr;
virtual Ptr getInstance() const = 0; // Pure virtual function in intermediate class
virtual void anotherPureVirtualFunction() const = 0; // Additional pure virtual function
};
// Derived Class
class StageInequalityMultipleShoothingSE2 : public IntermediateStageInequality {
public:
using Ptr = std::shared_ptr;
Ptr getInstance() const override {
return std::make_shared();
}
void somePureVirtualFunction() const override {
std::cout getInstance();
instance->somePureVirtualFunction();
instance->anotherPureVirtualFunction();
return 0;
}
Вот какую ошибку я получаю
/tmp/cjQvg2FHbj.cpp:22:25: error: invalid covariant return type for 'virtual mpc_local_planner::IntermediateStageInequality::Ptr mpc_local_planner::IntermediateStageInequality::getInstance() const'
22 | virtual Ptr getInstance() const = 0; // Pure virtual function in intermediate class
| ^~~~~~~~~~~
/tmp/cjQvg2FHbj.cpp:11:25: note: overridden function is 'virtual mpc_local_planner::StageInequalityBase::Ptr mpc_local_planner::StageInequalityBase::getInstance() const'
11 | virtual Ptr getInstance() const = 0; // Pure virtual function
| ^~~~~~~~~~~
ERROR!
/tmp/cjQvg2FHbj.cpp:31:17: error: invalid covariant return type for 'virtual mpc_local_planner::StageInequalityMultipleShoothingSE2::Ptr mpc_local_planner::StageInequalityMultipleShoothingSE2::getInstance() const'
31 | Ptr getInstance() const override {
| ^~~~~~~~~~~
/tmp/cjQvg2FHbj.cpp:22:25: note: overridden function is 'virtual mpc_local_planner::IntermediateStageInequality::Ptr mpc_local_planner::IntermediateStageInequality::getInstance() const'
22 | virtual Ptr getInstance() const = 0; // Pure virtual function in intermediate class
| ^~~~~~~~~~~
Подробнее здесь: https://stackoverflow.com/questions/787 ... n-type-for