【问题标题】:Impossible expected class-name before ‘{’ token error to solve解决“{”令牌错误之前不可能的预期类名
【发布时间】:2010-11-28 12:45:45
【问题描述】:

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

“{”标记之前的预期类名

好吧,尽管我努力工作和谷歌搜索,我还是无法解决这个错误。对不起。这是我最后的海岸。

在我的一个项目的 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

请注意我使用 ;在每节课的 } 之后,我检查了项目中的每个标题以查找此问题,但没有找到任何未跟随的类;在它的右括号之后。这对工作流.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

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

【问题讨论】:

  • 也许我错过了,但我看不出您提供的代码有什么问题。你确定没有其他头文件有相同的_WFQUEUE_HPP include guard 吗?
  • 绝对没有其他文件有这个

标签: c++ class inheritance inclusion


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    只是一个疯狂的猜测:您的错误在

    中说明了这一点
    class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
    //...
    };
    

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

    【讨论】:

    • 谢谢 Tsurunyan 先生...问题是一个完全不同的问题...幸运的是我能注意到它...非常奇怪...阅读我的回答并笑一笑 :)
    【解决方案3】:

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

    【讨论】:

    • 从我的回答中可以看出...问题是另一个问题,但与您告诉我的问题有关。感谢您的努力。
    【解决方案4】:

    这是从未发生过的事情......我的上帝对不起...... 看来我的虚拟机备份盘和原来的盘相撞了。我在虚拟机上运行我的项目,进行备份,2 小时前,可能搞砸了一些东西......我调整了它,现在虚拟机可以找到正确的文件夹和正确的文件进行编译。太棒了,哈哈,很明显,ols 文件 g++ 试图在以前的版本充满错误的地方编译……这是其中一个错误……重复的保护头。 Icecrime 是对的……尽管我在我的文件中寻找重复项,但在以前的版本中,我没有解决这个问题,我粘贴了一些文件并忘记更改保护头。 感谢大家的耐心和努力。 很抱歉,我没有注意到我的机器中出现了这个非常奇怪的虚拟磁盘冲突。再次感谢。

    【讨论】:

    • 是的,你说我的回答不正确并且仍然接受它......我不明白;)
    • 嗯,其实你的答案是正确的阿门。我从您的陈述开始,以了解哪里出了问题以及您建议我的程序是正确的。由于碰撞而出现错误的事实与我的机器有关。我认为对于这个社区,如果有人遇到,这个错误应该作为你的答案。我的案例是一个非常特殊的案例,但您的回答非常笼统,而且不知何故具体;这就是为什么我选择它作为正确的。
    【解决方案5】:

    确保你输入了

    using namespace omnetpp;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2014-03-16
      • 1970-01-01
      相关资源
      最近更新 更多