2011-10-03 84 views
8

使用stl_vector.h在使用G ++编译我得到这个错误。我在Linux上。克++预期“(”令牌

{ 
    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: error: expected unqualified-id before ‘(’ token

我不知道之前不合格-ID为什么我“M收到这个错误,我寻觅了一番,发现一些‘相似’的问题,但我解决不了我的

编辑:所以这里的错误日志:

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 

您可以在以前的错误日志“矢量”得到由标题“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" 

然后调用矢量位/ 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 

只是从矢量(stl_vector和stl_bvector)的最后2个标题给我完全相同的错误,其余都是好的。有任何想法吗?

在此先感谢您的帮助。

+9

你碰巧有个#define max或类似的地方吗? – user786653

+0

只是猜测,但尝试删除常量。 – Dabbler

+5

你是直接包含'stl_vector.h'还是包含'vector'头文件 –

回答

1

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

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

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

编辑:我错了,你发布的代码是实现的一部分,所以它使用保留标识符是完全合适的。

/usr/include/c++/4.5/bits/stl_vector.h在我的系统上包含相同的代码。您自己的代码中很可能会导致错误。例如,如果我做

#include <bits/stl_vector.h> 

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

#include <vector> 

但如果#include <vector>之前,你一定#define宏它可能引起问题的,你看到。

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

+3

他显示的代码与他的编译器的标准库一起提供,所以他不能更改它,也不应该。 – ildjarn

+0

@ildjarn:很对,谢谢。我应该注意到我自己。 –

+0

@KeithThompson我加了一个更详细的解释。谢谢你的帮助 – user977480

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头文件在包含一些其他实现细节文件(包括定义std::max的文件)后包含位/ stl_vector.h。

+0

嘿,我在主帖中添加了一些关于这个错误的更多解释,即时通讯使用#include ,但是当向量调用这个头文件这就是当我得到编译器错误时。 – user977480

9

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

要检查,你可以

  • 预处理源与gcc -E和搜索输出相应的代码。检查它是否完好无损。
  • #include <vector>之前加一条#undef max行,看看是否有帮助。
+3

谢谢,#undef max修复了这个问题:) – user977480

+1

这节省了我,我使用别人的代码,不知道发生了什么。 – diedthreetimes

+0

这解决了我的问题。在linux g ++中得到相同的错误。这是由于我的代码中定义了宏“max”。重命名此宏后,此错误消失。 – rashok