我收到了这个错误。这就像编译器无法识别我的声明
g++ -c main.cc
In file included from Storage.h:7:0,
from Server.h:5,
from Control.h:8,
from main.cc:5:
Serializer.h:11:36: error: ‘Storage::UpdateType’ has not been declared
Serializer.h:12:45: error: ‘Storage::UpdateType’ has not been declared
make: *** [main.o] Error 1
任何人都知道这个错误是什么,因为枚举已经声明了。受影响的代码如下:
Serializer.h
#ifndef SERIALIZER_H
#define SERIALIZER_H
#include "Storage.h"
class Storage;
class Serializer{
public:
Serializer();
void serialize(List&, Storage::UpdateType&, std::string&);
void deserialize(std::string&, Storage::UpdateType&, List&);
};
#endif
storage.h定义
#ifndef STORAGE_H
#define STORAGE_H
#include "List.h"
#include "Interface.h"
#include "Movie.h"
#include "Serializer.h"
class Storage{
public:
enum UpdateType {ADD, DELETE, RETRIEVE};
Storage();
~Storage();
List* list;
void retrieve(List*);
void update(UpdateType, List*);
void handleRequest(string&, string&);
private:
//Serializer serial;
};
#endif
答案 0 :(得分:0)
您遇到的问题是您的代码解释如下:
#ifndef STORAGE_H
#define STORAGE_H
// replacing the include with the Serializer.h file
#include "List.h"
#include "Interface.h"
#include "Movie.h"
// replacing the include with the Storage.h file
#ifndef STORAGE_H // returns true
#endif
class Storage;
class Serializer{
public:
Serializer();
// here Storage::UpdateType is still unknown to the compiler
void serialize(List&, Storage::UpdateType&, std::string&);
void deserialize(std::string&, Storage::UpdateType&, List&);
};
#endif
class Storage{
public:
// as it gets declared here
enum UpdateType {ADD, DELETE, RETRIEVE};
Storage();
~Storage();
List* list;
void retrieve(List*);
void update(UpdateType, List*);
void handleRequest(string&, string&);
private:
//Serializer serial;
};
#endif
最好的解决方案是imho,它将从您的存储类中提取enum UpdateType
,然后在Serializer中将其声明。或者甚至在Serializer头中声明它,因为Storage
封装了Serializer
内容,所以基本上,UpdateType
内容应该与Serializer
内容在同一封装上下文中。
另一个解决方案是@Nim建议,包括来自Serializer的存储,在存储中转发声明Serializer,并在main中包含Serializer。但它可能会欺骗你的设计思路,扭转Serializer
和Storage
的封装。
最后,我确实不确定这是否可行以及语法如何,但如果是,则可以简单地在Serializer中转发声明enum Storage::UpdateType
。我想这就是你希望的可能。