恩欧姆还没有被宣布?

时间:2014-03-07 14:07:16

标签: c++

我收到了这个错误。这就像编译器无法识别我的声明

 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

1 个答案:

答案 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。但它可能会欺骗你的设计思路,扭转SerializerStorage的封装。

最后,我确实不确定这是否可行以及语法如何,但如果是,则可以简单地在Serializer中转发声明enum Storage::UpdateType。我想这就是你希望的可能。