[英]Classes, error: ISO C++ forbids declaration of 'Task' with no type
有人可以帮我理解我的错误。 我是班级概念的新手,不确定我缺少什么。 我没有在头文件中正确声明Task * _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 %s\n",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
是一个类。 也就是说,把class Task;
放进去class Task;
在引用Task
之前在MonReqServer.hh中。
关于与隐式声明析构函数有关的错误:这是因为您定义了析构函数而未声明它。 添加~MonReqServer();
到头文件。
似乎标题
#include "pds/service/Task.hh"
包含Task
声明的表既不显式也不隐式包含在标头MonReqServer.hh
,该标头在类MonReqServer
的定义中MonReqServer
class MonReqServer : public Appliance, public Routine {
public:
//...
private:
Task* _task;
^^^^^
};
由于编译器不知道Task
表示什么名称,因此它也忽略了_task
变量的_task
。
同样,类定义不包含析构函数声明。 但是,您在文件MonReqServer.cc
定义了析构函数
MonReqServer::~MonReqServer()
{
_task->destroy();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.