【问题标题】:g++ expected unqualified-id before ‘(’ tokeng ++在“(”标记之前需要不合格的ID
【发布时间】:2011-10-03 22:02:21
【问题描述】:

我在使用stl_vector.h 时遇到此错误。我在 Linux 上使用 g++ 编译。

{
  if (max_size() - size() < __n)
    __throw_length_error(__N(__s));

  const size_type __len = size() + std::max(size(), __n); //THE ERROR IS ON THIS LINE!
  return (__len < size() || __len > max_size()) ? max_size() : __len;
}

usr/include/c++/4.5/bits/stl_vector.h:1143:40: 错误:‘(’ 令牌之前的预期 unqualified-id

我不知道为什么会出现这个错误,我搜索了很多并发现了一些“类似”的问题,但我无法解决我的问题。

编辑:这是错误日志:

In file included from /usr/include/c++/4.5/vector:65:0,
             from ../../RL_Toolbox/include/caction.h:34,
             from ../../RL_Toolbox/include/cagent.h:35,
             from shortestpathQLearning.cpp:42:
/usr/include/c++/4.5/bits/stl_vector.h:1143:40: error: expected unqualified-id before ‘(’ token

您可以在前面的错误日志中看到“vector”被标题“caction.h”调用,如下所示:

//THESE ARE THE INCLUDES IN "caction.h"
#ifndef CACTION_H
#define CACTION_H
#include <stdio.h> 
#include <vector> //HERE IT CALLS <vector>
#include <list>
#include <map>
#include "cbaseobjects.h"

然后 Vector 像这样调用 bits/stl_vector.h:

#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1

#pragma GCC system_header

#include <bits/stl_algobase.h>
#include <bits/allocator.h>
#include <bits/stl_construct.h>
#include <bits/stl_uninitialized.h>
#include <bits/stl_vector.h>//HERE IT CALLS stl_vector.h
#include <bits/stl_bvector.h> //Im actually getting the exact same error from  stl_vector.h on this header

只有来自 vector 的最后 2 个标头(stl_vector 和 stl_bvector)给了我完全相同的错误,其余的都可以。有什么想法吗?

提前感谢您的帮助。

【问题讨论】:

  • 你在某个地方碰巧有#define max 或类似的东西吗?
  • 您是直接包含stl_vector.h 还是包含vector 标头
  • 你能在预处理器完成工作后查看文件吗?这可能会揭示问题。
  • 只使用&lt;vector&gt;有什么问题吗? stl_vector.h 应该是一个甚至不能保证存在的实现细节。
  • @Dabbler:这不是他的代码。它在 bits/stl_vector.h,size_type _M_check_len() 的正文中。

标签: c++ g++


【解决方案1】:

这可能是由于预处理器损坏了您的代码,可能是因为您定义了宏max。这可能发生在 C 库中,因为通常 C 标准允许 C 标准库函数实际上是宏(尽管我只在 MSVC 上看到过这样的事故)。

要检查,你可以

  • 使用gcc -E 预处理源代码并在输出中搜索相应的代码。检查它是否完好无损。
  • #include &lt;vector&gt; 之前添加#undef max 行,看看是否有帮助。

【讨论】:

  • 谢谢,#undef max 解决了这个问题:)
  • 这救了我,我用的是别人的代码,不知道怎么回事。
  • 这解决了我的问题。在 linux g++ 中出现同样的错误。这是由于在我的代码中定义了宏“max”。重命名此宏后,此错误消失。
  • 对于那些在Windows(或winegcc)上编译的,这也可以通过设置NOMINMAX per stackoverflow.com/a/7449671/3196753来解决
【解决方案2】:

user977480,鉴于您说“我在使用 stl_vector.h 时遇到此错误”,我认为这意味着您的代码正在使用类似 #include &lt;bits/stl_vector.h&gt;#include &lt;c++/4.5/bits/stl_vector.h&gt; 的东西。

这个#include 声明是您的问题的原因。您需要改用#include &lt;vector&gt;。 stl_vector.h 是一个实现细节,它本身不起作用。 vector 头文件包含 bits/stl_vector.h 之后,它包含了一些其他实现细节文件,包括定义 std::max 的那个。

【讨论】:

  • 嘿,我在主帖中添加了关于此错误的更多解释,我使用#include 但是当vector调用该标题时 那是我得到编译器错误。
【解决方案3】:

切勿使用以双下划线或下划线后跟大写字母开头的标识符,除非它们是由实现提供的。

允许编译器和/或标准库以他们喜欢的任何方式使用__N__s__len 等等。

这不是你的问题,但看看如果你改变所有这些标识符会发生什么。

编辑:我错了,您发布的代码是实现的一部分,因此它使用保留标识符非常合适。

我系统上的/usr/include/c++/4.5/bits/stl_vector.h 包含相同的代码。很可能是您自己的代码中的某些内容导致了错误。例如,如果我这样做

#include <bits/stl_vector.h>

我收到 156 个错误。正确的做法是

#include <vector>

但如果你在#include &lt;vector&gt; 之前#define 某些宏可能会导致你看到的问题。

向我们展示您的代码,最好缩小到出现错误的最小源文件。

【讨论】:

  • 他正在展示他的编译器标准库附带的代码,所以他不能更改,也不应该更改。
  • @ildjarn:非常正确,谢谢。我自己应该注意到的。
  • @KeithThompson 我添加了更详细的解释。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多