g ++期望在'('标记之前)的非限定id

时间:2011-10-03 22:02:21

标签: c++ g++

使用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的最后两个标题(stl_vector和stl_bvector)给出了完全相同的错误,其余的都没问题。有什么想法吗?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

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

要检查,您可以

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

答案 1 :(得分:2)

user977480,假设您说“我在使用stl_vector.h时遇到此错误”,我认为这意味着您的代码使用#include <bits/stl_vector.h>#include <c++/4.5/bits/stl_vector.h>之类的内容。

#include语句是导致问题的原因。您需要使用#include <vector>代替。 stl_vector.h是一个实现细节,它本身不起作用。 vector头文件包含其他实现细节文件后包含bits / stl_vector.h,包括定义std::max的文件。

答案 2 :(得分:1)

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

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

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

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

我系统上的

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

#include <bits/stl_vector.h>

我得到156个错误。正确的方法是

#include <vector>

但如果你#define之前的#include <vector>某些宏可能会导致您遇到的问题。

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