g ++ ожидал неквалифицированный идентификатор перед токеном ‘(’ - PullRequest
8 голосов
/ 04 октября 2011

Я получаю эту ошибку при использовании 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: ошибка: ожидаемый неквалифицированный идентификатор до ‘(’ токен

Я не уверен, почему я получаю эту ошибку, я много искал и нашел "похожие" проблемы, но не могу решить мою.

РЕДАКТИРОВАТЬ: так вот журнал ошибок:

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"

тогда 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

только последние 2 заголовка из вектора (stl_vector и stl_bvector) дают мне точно такую ​​же ошибку, с остальными все в порядке. Есть идеи?

Заранее спасибо за помощь.

Ответы [ 3 ]

10 голосов
/ 05 октября 2011

Это может быть вызвано тем, что препроцессор повредил ваш код, возможно потому, что у вас определен макрос max. Это может случиться с библиотекой C, потому что обычно стандарт C позволяет функциям стандартной библиотеки C быть на самом деле макросами (хотя я видел такой сбой только в MSVC).

Чтобы проверить, вы можете

  • предварительно обработайте источник с помощью gcc -E и найдите выход для соответствующего кода. Проверьте, не поврежден ли он.
  • добавьте строку #undef max перед #include <vector> и посмотрите, поможет ли это.
2 голосов
/ 04 октября 2011

user977480, учитывая, что вы сказали «Я получаю эту ошибку при использовании stl_vector.h», я предполагаю, что это означает, что ваш код использует что-то вроде #include <bits/stl_vector.h> или #include <c++/4.5/bits/stl_vector.h>.

This #include утверждение является причиной вашей проблемы.Вам нужно использовать #include <vector> вместо этого.stl_vector.h - это деталь реализации, и она не работает сама по себе.Заголовочный файл vector включает биты / stl_vector.h после того, как он включил некоторые другие подробные файлы реализации, включая тот, который определяет std::max.

1 голос
/ 04 октября 2011

Никогда не используйте идентификаторы, начинающиеся с двойного или нижнего подчеркивания, за которым следует заглавная буква, если они не предоставлены реализацией.

Компилятору и / или стандартной библиотеке разрешено использовать __N, __s, __len и т. Д. Любым удобным для них способом.

Не очевидно, что это ваша проблема, но посмотрите, что произойдет, если вы измените все эти идентификаторы.

РЕДАКТИРОВАТЬ : Я был не прав, код, который вы разместили, является частью реализации, поэтому использование зарезервированных идентификаторов совершенно уместно.

/usr/include/c++/4.5/bits/stl_vector.h в моей системе содержит тот же код. Скорее всего, что-то в вашем собственном коде вызывает ошибку. Например, если я сделаю

#include <bits/stl_vector.h>

Я получаю 156 ошибок. Правильный путь

#include <vector>

но если вы #define определите макросы до #include <vector>, это может вызвать проблему, с которой вы столкнулись.

Покажите нам ваш код, предпочтительно суженный до наименьшего исходного файла с ошибкой.

...