【问题标题】:position.hh:46: error: expected unqualified-id before ‘namespace’position.hh:46: 错误: 'namespace' 之前的预期 unqualified-id
【发布时间】:2011-01-15 02:41:47
【问题描述】:

这是我的代码:

 34  
 35 /**  
 36  ** \file position.hh  
 37  ** Define the example::position class.  
 38  */  
 39   
 40 #ifndef BISON_POSITION_HH   
 41 #define BISON_POSITION_HH   
 42    
 43 #include <iostream>   
 44 #include <string>   
 45    
 46 namespace example   
 47 {   
 48   /// Abstract a position.   
 49   class position   
 50   {   
 51   public:   
 52    
 53     /// Construct a position.   
 54     position ()    
 55       : filename (0), line (1), column (0)   
 56     {    

谢谢,speeder,太好了。 Necrolis,也谢谢你。你们两个在编译单元上都在同一轨道上。这是完整的错误报告:

在 location.hh:45 包含的文件中, 来自 parser.h:64, 来自scanner.h:25, 来自scanner.ll:8: position.hh:46: 错误:“命名空间”之前的预期 unqualified-id

location.hh 看起来像这样:

35 /**
36  ** \file location.hh
37  ** Define the example::location class.
38  */
39 
40 #ifndef BISON_LOCATION_HH
41 # define BISON_LOCATION_HH
42 
43 # include <iostream>
44 # include <string>
45 # include "position.hh"
46 
47 namespace example
48 {
49 
50   /// Abstract a location.
51   class location
52   {
53   public:

我还应该补充一点,这些文件是由 bison 生成的。正是当我尝试编译由 flex++ 生成的 c++ 扫描程序类时,我才到了这个阶段。我通过发出 flex --c++ -oscanner.ccscanner.ll 来获取 .cc 代码。

【问题讨论】:

    标签: c++ bison yacc flex-lexer


    【解决方案1】:

    当 a ;或命名空间之前缺少其他一些关闭的东西。您确定 34 之前的行没有代码吗?如果他们有代码(即使该代码是其他#include),错误就在那里。

    编辑:或者如果所有 34 行都没有代码,则错误出现在包含此标头的文件上,很可能有一个没有结尾的代码;或 } 或 ) 或其他一些结尾字符,紧随其后(当然忽略 cmets)有 #include position.hh

    或者如果一行中有两个包含,一个在 position.hh 之前,在 position.hh 之前包含的标题的最后几行有错误,通常是一个没有 ; 的结构结束后}

    【讨论】:

    • Speeder:我发布之前的所有行都是 cmets。谢谢!
    • 我已经删除了第 40 行之前的所有内容并尝试再次编译,同样的错误...
    • 好的...我知道如何跟踪它...那么错误很可能在包含此文件的文件中。在“#include position.hh”之前现在去那里检查一下。如果可能,请编辑您的帖子并粘贴包含之前的行。
    • omg 包含很多...所以,它似乎不在 location.hh 中,它可能在 parser.h 中 64 之前的一行或scanner.h 在 25 之前的一行中或8 之前的scanner.ll ......或者更糟糕的是,它可能在引用位置的任何包含文件中,或者在这些引用位置的包含链中。我编辑了我的遮阳篷,再读一遍,看看你能不能跟踪它。
    • Speeder 最接近事实,尽管 Necrolis 首先提供了通用解决方案。原来它不是在文件的开头或结尾,而是在我的一个头文件中的一个类中。该文件未被错误消息中报告的任何文件引用,而是在另一个标题的中间。事实上,问题在于一个没有 } 的不正确关闭的类;
    【解决方案2】:

    错误可能发生在报告的文件以外的文件中(由于编译单元),即在“其他”文件的末尾或附近(例如缺少“}”或“;”或“#endif”等)

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2013-07-06
      相关资源
      最近更新 更多