在'{'标记错误解决之前不可能预期的类名

时间:2010-11-28 12:45:46

标签: c++ class inheritance inclusion

这个该死的错误是一个众所周知的问题

'{'令牌

之前的预期类名

好吧,尽管我努力工作和谷歌搜索,我无法解决这个错误。抱歉。这是我的最后一支岸。

在我的一个项目的ui.cpp中我做了:

#include "wfqueue_proxy_factory.hpp"

好的,这在我的编译器中引发了这个愚蠢的错误:

  

包含来自的文件   wfqueue_proxy_factory.hpp:29,从   ui.cpp:28:   wfqueue_manager_proxy.hpp:42:错误:   '{'令牌

之前的预期类名

我的项目中有三个类: 第一

// wfqueue_proxy_factory.hpp
#ifndef _WFQUEUE_PROXY_FACTORY_HPP
#define _WFQUEUE_PROXY_FACTORY_HPP
#include "wfqueue_manager_proxy.hpp"
// ...
class WFQueueProxyFactory {
//...
};
#endif

第二

// wfqueue_manager_proxy.hpp
#ifndef _WFQUEUE_MANAGER_PROXY_HPP
#define _WFQUEUE_MANAGER_PROXY_HPP
#include "workflow.hpp"
#include "wfqueue.hpp"
// ...
class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
//...
};
#endif

第三

// wfqueue.hpp
#ifndef _WFQUEUE_HPP
#define _WFQUEUE_HPP
#include "workflow.hpp"
class WFQueue {
// ...
};
#endif

请您注意我使用;在每个班级之后,我检查了我的项目中的每个标题,寻找这个问题,并没有发现任何类没有跟着;在其结束后。这对workflow.hpp有效,这是一个简单的类(不是从任何类派生,只是普通类)。

WFQueue是一种接口,我也将这种模式与其他类一起使用并且它们可以工作。 WFQueue包含一些虚拟的纯方法......问题不应该在这里....我想这是因为我使用另一个“接口”类与其他类,它们工作正常。

如果我这样做,则此错误消失:

// wfqueue_manager_proxy.hpp
#ifndef _WFQUEUE_MANAGER_PROXY_HPP
#define _WFQUEUE_MANAGER_PROXY_HPP
#include "workflow.hpp"
#include "wfqueue.hpp"
// ...
class WFQueueManagerProxy {
//...
};
#endif

真的不知道如何解决这个问题...请帮帮我。 谢谢

5 个答案:

答案 0 :(得分:4)

您应该在代码上运行预处理器但不编译它,并检查结果。为此,请复制运行失败编译的命令,然后在大多数编译器中删除-o outfile选项并添加类似-E的内容(有关仅执行预处理的标志,请参阅编译器的文档) )。

编译器将发出(在stdout上)所有#includes的整个翻译单元并解决这个问题,这样你就可以清楚地看到缺少的内容(只需搜索与错误行匹配的代码行,然后查看即可查看你发现了什么声明)。如果还不清楚问题是什么,请将预处理的输出写入文件并尝试编译。然后,您可以调整预处理源,并查看修复它所需的内容。

答案 1 :(得分:3)

只是一个疯狂的猜测:你的错误说明在

class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
//...
};

在{之前必须有一个类名。因此,我假设编译器不知道WFQueue是一个类。你确定它的定义是否包括在内?我的意思是,也许在wfqueue.hpp中,这个类被命名为WfQueue或者以其他方式有所不同?

答案 2 :(得分:1)

问题可能在于错误名称包括警卫。尝试检查它们是否真的是每个文件的唯一。您似乎在编译WFQueue时禁用了WFQueueManagerProxy的定义。

答案 3 :(得分:1)

这件事从未发生过......我的上帝对不起...... 我的虚拟机备份磁盘似乎与原始磁盘冲突。我在虚拟机上运行我的项目,2小时前做备份可能搞砸了......我调整了它,现在虚拟机可以找到正确的文件夹和正确的文件进行编译。这是令人惊讶的ahaha和显而易见的,ols文件g ++尝试编译,其中以前的版本充满了错误......这是其中一个错误...一个警卫标题重复。 Icecrime是对的...尽管我在我的文件中寻找重复,在之前的版本中,我没有解决这个问题,我粘贴了一些文件,忘了更改防护标题。 感谢大家的耐心和努力。 对不起,我没注意到我机器上这个非常奇怪的虚拟磁盘碰撞。再次感谢。

答案 4 :(得分:0)

确保输入

using namespace omnetpp;

包括之后。它解决了我的问题。