类,错误:ISO C++禁止声明没有类型的"任务"

Classes, error: ISO C++ forbids declaration of 'Task' with no type

本文关键字:类型 任务 声明 禁止 错误 ISO C++      更新时间:2023-10-16

有人可以帮我理解我的错误吗?我对类的概念很陌生,不确定我错过了什么。我没有在头文件中正确声明任务* _task吗?谢谢。

MonReqServer.hh:18: error: ISO C++ forbids declaration of 'Task' with no type
MonReqServer.hh:18: error: expected ';' before '*' token
MonReqServer.cc: In constructor 'Pds::MonReqServer::MonReqServer()':
MonReqServer.cc:11: error: class 'Pds::MonReqServer' does not have any field named '_task'
MonReqServer.cc:13: error: '_task' was not declared in this scope
MonReqServer.cc: At global scope:
MonReqServer.cc:16: error: definition of implicitly-declared 'virtual Pds::MonReqServer::~MonReqServer()'
MonReqServer.cc: In destructor 'virtual Pds::MonReqServer::~MonReqServer()':
MonReqServer.cc:18: error: '_task' was not declared in this scope

MonReqServer.hh如下:

#ifndef Pds_MonReqServer_hh
#define Pds_MonReqServer_hh
#include "pds/utility/Appliance.hh"
#include "pds/service/Routine.hh"
namespace Pds {
  class MonReqServer : public Appliance, public Routine {
  public:
    MonReqServer();
  public:
    Transition* transitions(Transition*);
  InDatagram* events     (InDatagram*);
  void routine();
 private:
  Task* _task;
 };
};
#endif

MonReqServer.cc 如下:

 #include "pdsapp/tools/MonReqServer.hh"
 #include "pds/service/Task.hh"
#define mult_address "225.0.0.37"
#define mult_port "1100"
using namespace Pds;

 MonReqServer::MonReqServer() :
  _task(new Task(TaskObject("monlisten")))
{
  _task->call(this);
 }
 MonReqServer::~MonReqServer()
 {
  _task->destroy();
 }

Transition* MonReqServer::transitions(Transition* tr)
{
  printf("MonReqServer transition %sn",TransitionId::name(tr->id()));
 return tr;
}
  void MonReqServer::routine()
  {
 int udp_socket_info;
 struct sockaddr_in udp_server;
 struct sockaddr addr;
 struct ip_mreq mreq;
 socklen_t fromlen;
 fromlen = sizeof addr;
 char incoming_message[100];
    udp_socket_info = socket(AF_INET, SOCK_DGRAM, 0);
    if (udp_socket_info == -1) {
    puts("Could not create socket");
    }
   memset((char*)&udp_server,0,sizeof(udp_server));
    udp_server.sin_family=AF_INET;
    udp_server.sin_port = htons( 1100 ); 
    udp_server.sin_addr.s_addr = INADDR_ANY; 
    if (bind(udp_socket_info,(struct sockaddr *)&udp_server, sizeof(udp_server)) < 0) {
  perror("bind error");
  exit (1);
      }
puts("bind");
 //join multicast group
 mreq.imr_multiaddr.s_addr=inet_addr(mult_address); 
 mreq.imr_interface.s_addr=htonl(INADDR_ANY); 
 if (setsockopt(udp_socket_info, IPPROTO_IP,IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
  perror("setsockopt");
  exit (1);
      }
    if (recvfrom(udp_socket_info, incoming_message , sizeof(incoming_message), 0, &addr, &fromlen) <0) {
    perror("recvfrom");
    }       
puts("Message received");
char tcp_ip[20];
char tcp_port[20];
sscanf( incoming_message, "%s %s", tcp_ip, tcp_port);
}
InDatagram* MonReqServer::events     (InDatagram* dg)
{
 (dg->seq.service()==TransitionId::L1Accept) {
 }
 return dg;
 }

您可能需要更改MonReqServer.hh中#include的顺序(我假设Task是在Task.hh中定义的(。但即便如此,在 MonReqServer.hh 中转发声明Task也是一个好主意,以便包括MonReqServer.hh在内的其他源文件知道Task是一个类。也就是说,在引用Task之前,将class Task;放在MonReqServer.hh中。

关于隐式声明析构函数

的错误:这是因为您定义了析构函数而没有声明它。将~MonReqServer();添加到头文件。

似乎标题

#include "pds/service/Task.hh"

包含 Task 声明的声明既没有显式也没有隐式包含在标题MonReqServer.hh中,它用于类MonReqServer

的定义
  class MonReqServer : public Appliance, public Routine {
  public:
  //...
 private:
  Task* _task;
  ^^^^^
 };

由于编译器不知道Task表示什么名称,因此它也忽略了变量_task的声明。

此外,类定义不包含析构函数声明。但是,您在文件MonReqServer.cc中定义了析构函数

 MonReqServer::~MonReqServer()
 {
  _task->destroy();
 }