简体   繁体   English

C ++纯虚拟错误

[英]C++ pure virtual error

I am trying to inherit from an abstract class but getting the following errors: 我正在尝试从抽象类继承,但出现以下错误:

In file included from /usr/include/c++/5/vector:64:0, from /usr/include/boost/format.hpp:17, from /usr/include/boost/math/policies/error_handling.hpp:31, from /usr/include/boost/math/special_functions/round.hpp:14, from /opt/ros/kinetic/include/ros/time.h:58, from /opt/ros/kinetic/include/ros/ros.h:38, from /home/gil/catkin_ws/src/manager/include/Tasks/Task.h:4, from /home/gil/catkin_ws/src/manager/src/Tasks/Task.cpp:1: /usr/include/c++/5/bits/stl_vector.h:713:7: error: invalid abstract parameter type 'manager::Task' resize(size_type __new_size, value_type __x = value_type()) 在/usr/include/c++/5/vector:64:0、/usr/include/boost/format.hpp:17、/usr/include/boost/math/policies/error_handling.hpp:31包含的文件中,从/usr/include/boost/math/special_functions/round.hpp:14,从/opt/ros/kinetic/include/ros/time.h:58,从/ opt / ros / kinetic / include / ros / ros .h:38,来自/home/gil/catkin_ws/src/manager/include/Tasks/Task.h:4,来自/home/gil/catkin_ws/src/manager/src/Tasks/Task.cpp:1:/ usr / include / c ++ / 5 / bits / stl_vector.h:713:7:错误:无效的抽象参数类型'manager :: Task'resize(size_type __new_size,value_type __x = value_type())

-- -

/home/gil/catkin_ws/src/manager/include/Tasks/Task.h:11:16: note: /home/gil/catkin_ws/src/manager/include/Tasks/Task.h:11:16:注意:
virtual void manager::Task::Execute() virtual void Execute() = 0; 虚拟虚空管理器:: Task :: Execute()虚拟虚空Execute()= 0; ^ In file included from /usr/include/c++/5/vector:64:0, from /usr/include/boost/format.hpp:17, from /usr/include/boost/math/policies/error_handling.hpp:31, from /usr/include/boost/math/special_functions/round.hpp:14, from /opt/ros/kinetic/include/ros/time.h:58, from /opt/ros/kinetic/include/ros/ros.h:38, from /home/gil/catkin_ws/src/manager/include/Tasks/Task.h:4, from /home/gil/catkin_ws/src/manager/include/Tasks/RootTask.h:10, from /home/gil/catkin_ws/src/manager/src/Tasks/RootTask.cpp:8: /usr/include/c++/5/bits/stl_vector.h:713:7: error: invalid abstract parameter type 'manager::Task' resize(size_type __new_size, value_type __x = value_type()) ^在/usr/include/c++/5/vector:64:0、/usr/include/boost/format.hpp:17、/usr/include/boost/math/policies/error_handling.hpp包含的文件中: 31,来自/usr/include/boost/math/special_functions/round.hpp:14,来自/opt/ros/kinetic/include/ros/time.h:58,来自/ opt / ros / kinetic / include / ros / ros.h:38,来自/home/gil/catkin_ws/src/manager/include/Tasks/Task.h:4,来自/home/gil/catkin_ws/src/manager/include/Tasks/RootTask.h:10,来自/home/gil/catkin_ws/src/manager/src/Tasks/RootTask.cpp:8:/usr/include/c++/5/bits/stl_vector.h:713:7:错误:无效的抽象参数类型'manager: :任务的大小调整(size_type __new_size,value_type __x = value_type())

-- -

manager/CMakeFiles/manager.dir/build.make:110: recipe for target 'manager/CMakeFiles/manager.dir/src/Tasks/Task.cpp.o' failed make[2]: * [manager/CMakeFiles/manager.dir/src/Tasks/Task.cpp.o] Error 1 make[2]: * Waiting for unfinished jobs.... manager/CMakeFiles/manager.dir/build.make:158: recipe for target 'manager/CMakeFiles/manager.dir/src/Tasks/RootTask.cpp.o' failed make[2]: *** [manager/CMakeFiles/manager.dir/src/Tasks/RootTask.cpp.o] Error 1 In file included from /usr/include/c++/5/vector:64:0, from /usr/include/boost/format.hpp:17, from /usr/include/boost/math/policies/error_handling.hpp:31, from /usr/include/boost/math/special_functions/round.hpp:14, from /opt/ros/kinetic/include/ros/time.h:58, from /opt/ros/kinetic/include/ros/ros.h:38, from /home/gil/catkin_ws/src/manager/src/indoor_mission_action_server.cpp:9: /usr/include/c++/5/bits/stl_vector.h:713:7: error: invalid abstract parameter type 'manager::Task' resize(size_type __new_size, value_type __x = value_type()) manager / CMakeFiles / manager.dir / build.make:110:目标'manager / CMakeFiles / manager.dir / src / Tasks / Task.cpp.o'的配方制作失败[2]: * [manager / CMakeFiles / manager。 dir / src / Tasks / Task.cpp.o]错误1 make [2]:*等待未完成的作业。...manager / CMakeFiles / manager.dir / build.make:158:目标'manager / CMakeFiles / manager.dir / src / Tasks / RootTask.cpp.o'失败[2]:*** [manager / CMakeFiles / manager.dir / src / Tasks / RootTask.cpp.o]错误1在/ usr包含的文件中/ include / c ++ / 5 / vector:64:0,来自/usr/include/boost/format.hpp:17,来自/usr/include/boost/math/policies/error_handling.hpp:31,来自/ usr / include /boost/math/special_functions/round.hpp:14,来自/opt/ros/kinetic/include/ros/time.h:58,来自/opt/ros/kinetic/include/ros/ros.h:38,来自/home/gil/catkin_ws/src/manager/src/indoor_mission_action_server.cpp:9:/usr/include/c++/5/bits/stl_vector.h:713:7:错误:无效的抽象参数类型'manager :: Task'调整大小(size_type __new_size,value_type __x = value_type())

Not sure what am i missing... Here are my H and CPP files: 不确定我缺少什么...这是我的H和CPP文件:

RootTask.cpp RootTask.cpp

#include "Tasks/RootTask.h"
namespace manager {
  RootTask::RootTask(std::string name) {
    mTaskName = name;
  }
  RootTask::~RootTask() {}
  RootTask::RootTask() {}

  void RootTask::Execute() {}

  void RootTask::setTaskSeqByName() {}
  std::string RootTask::GetTaskName() {
    return mTaskName;
  }
}

RootTask.h RootTask.h

#include "Tasks/Task.h"
namespace manager {
  class RootTask: public Task {
    public:

      RootTask();
    RootTask(std::string name);~RootTask();

    void Execute();
    void setTaskSeqByName();
    std::string GetTaskName();
  };
}

Task.cpp Task.cpp

#include "Tasks/Task.h"
#include < iostream >

  namespace manager {
    void Task::Stop() {}
    void Task::Pause() {}
    void Task::OnError() {}
    std::string Task::GetTaskName() {}
    void Task::setTaskSeqByName() {}
  }

Task.h Task.h

#pragma once

#include < iostream > 
#include "ros/ros.h"

namespace manager {
  class Task {
    public:
      virtual void Execute() = 0;
    virtual void setTaskSeqByName();
    virtual void Stop();
    virtual void Pause();
    virtual void OnError();
    virtual std::string GetTaskName();

    protected:
      std::string mTaskName;
    std::vector < Task > mTaskSequence;
  };
}

Thank you for the assistance. 感谢您的帮助。

In Task you have a member Task您有一个成员

std::vector < Task > mTaskSequence;

You cannot have this as Task is an abstract class and you cannot make an instance of it. 您不能拥有该类,因为Task是一个抽象类,您不能创建它的实例。 You need to use a pointer type like 您需要使用类似的指针类型

std::vector<std::unique_ptr<Task>> mTaskSequence;

The answer by @NathanOliver points out how you can fix the compiler error. @NathanOliver的答案指出了如何解决编译器错误。

I want to point out that having a Task contain list of pointers to other Task s seems to be a possible design flaw. 我想指出,让Task包含指向其他Task的指针的列表似乎是可能的设计缺陷。

You may want to consider moving it up to a higher level class that deals with sequences of Task s. 您可能需要考虑将其上移至处理Task序列的更高级别的类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM