C ++纯虚拟错误

时间:2018-03-26 21:28:21

标签: c++ c++11

我试图从一个抽象类继承,但得到以下错误:

  

在/ 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:注意:
  virtual void manager :: Task :: Execute()virtual void Execute()= 0;                   ^在/ 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 :: Task'          resize(size_type __new_size,value_type __x = value_type())

-

  

manager / CMakeFiles / manager.dir / build.make:110:目标配方   '管理器/ CMakeFiles / manager.dir / SRC /任务/ Task.cpp.o'失败了[2]:    * [manager / CMakeFiles / manager.dir / src / Tasks / Task.cpp.o]错误1 make [2]:* 等待未完成的工作....   manager / CMakeFiles / manager.dir / build.make:158:目标的配方   '管理器/ CMakeFiles / manager.dir / SRC /任务/ RootTask.cpp.o'失败   make [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'          resize(size_type __new_size,value_type __x = value_type())

不确定我错过了什么...... 这是我的H和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

#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

#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

#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;
  };
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

Task您有会员

std::vector < Task > mTaskSequence;

你不能拥有它,因为Task是一个抽象类,你不能创建它的实例。您需要使用类似

的指针类型
std::vector<std::unique_ptr<Task>> mTaskSequence;

答案 1 :(得分:1)

@NathanOliver的回答指出了如何修复编译器错误。

我想指出,让Task包含指向其他Task的指针列表似乎是一个可能的设计缺陷。

您可能需要考虑将其移至处理Task s序列的更高级别的课程。