Функция-член не найдена после статического приведения из базы в производную - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь создать функцию с именем 'step', которая принимает указатель базового класса и выполняет некоторые действия.В настоящее время я использую фиктивный базовый класс, чтобы включить общий интерфейс.

#include <iostream>

using namespace std;

class gym_action //dummy base
{
public:
    virtual ~gym_action(){}
};

template<typename T>
class action_helper : public gym_action
{
    public :
        action_helper(T a) : action_item(a){}
        T get_action() {return action_item;}

    private:
       T action_item;

};

void step(gym_action* act)
{
    act = dynamic_cast<action_helper<int>*>(act);
    cout<<act->get_action()<<endl;
}

int main()
{

    action_helper<int> a(2);
//I will have more action_helper instansiations, like action_helper<Eigen::VectorXf> etc
    cout<<a.get_action()<<endl;
    step(&a);

}

Этот код завершается с ошибкой gym_class не имеет функции-члена get_action.Ясно, что причина этого в том, что в базовом классе нет виртуальной функции get_action.

Однако как я могу это определить?Причины, по которым я сейчас не могу, состоят в том, что каждая шаблонная функция get_action возвращает свой тип T.Один из возможных способов - заранее определить все возможные перегрузки в базовом классе, но это кажется плохим дизайном.Есть мысли?

1 Ответ

1 голос
/ 27 сентября 2019

Даже после dynamic_cast переменная act по-прежнему имеет тип gym_action*.Следовательно, вы не можете вызывать производную функцию-член класса для него.

Использовать новую переменную.

auto temp = dynamic_cast<action_helper<int>*>(act);
if ( temp != nullptr )
{
   cout << temp->get_action() << endl;
}
...