2011-10-03 17 views
8

sto ottenendo questo errore quando si utilizza stl_vector.h. Sono su Linux usando g ++ per compilare.g ++ atteso non qualificato-id prima '(' token

{ 
    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

Io non sono sicuro perché ho 'm ottenere questo errore, ho cercato un sacco e ha trovato alcuni problemi 'simili', ma non riesco a risolvere il mio

EDIT:. quindi ecco il log degli errori:

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 

Si può vedere nel precedente log degli errori che "vettore" viene chiamato dal header "caction.h" come questo:

//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" 

poi Vector chiama bit/stl_vector.h come questo:

#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 

solo le ultime 2 intestazioni da vettore (stl_vector e stl_bvector) mi danno lo stesso identico errore, il resto è ok. Qualche idea?

Grazie in anticipo per il vostro aiuto.

+9

Ti capita di avere un "#define max" o qualcosa del genere da qualche parte? – user786653

+0

Solo a indovinare, ma prova a rimuovere il const. – Dabbler

+5

Stai includendo 'stl_vector.h' direttamente o l'intestazione' vector' –

risposta

1

Non utilizzare mai identificatori che iniziano con una doppia sottolineatura o un trattino basso seguito da una lettera maiuscola, a meno che non siano forniti dall'implementazione.

Il compilatore e/o libreria standard sono autorizzati a utilizzare __N, __s, __len, e così via, in qualsiasi modo a loro piace.

Non è ovvio che questo è il tuo problema, ma guarda cosa succede se cambi tutti quegli identificatori.

EDIT: Ho sbagliato, il codice che hai postato è parte dell'implementazione, quindi il suo uso di identificatori riservati è perfettamente appropriato.

/usr/include/c++/4.5/bits/stl_vector.h sul mio sistema contiene lo stesso codice. Molto probabilmente qualcosa nel tuo codice sta causando l'errore. Ad esempio, se faccio

#include <bits/stl_vector.h> 

Ottengo 156 errori. Il modo corretto è

#include <vector> 

ma se si #define alcune macro prima della #include <vector> esso potrebbe causare il problema che stai vedendo.

Mostrare il codice, preferibilmente ridotto al file di origine più piccolo che presenta l'errore.

+3

Sta mostrando il codice fornito con la libreria standard del suo compilatore, quindi non può cambiarlo, né dovrebbe. – ildjarn

+0

@ildjarn: Giusto, grazie. Avrei dovuto notarlo anch'io. –

+0

@KeithThompson Ho aggiunto una spiegazione più dettagliata. Grazie mille per il tuo aiuto – user977480

2

user977480, dato che hai detto "Sto ricevendo questo errore quando si utilizza stl_vector.h", presumo che il tuo codice stia usando qualcosa come #include <bits/stl_vector.h> o #include <c++/4.5/bits/stl_vector.h>.

Questa dichiarazione #include è la causa del problema. Devi invece usare #include <vector>. stl_vector.h è un dettaglio di implementazione e non funziona da solo.Il file di intestazione vector include bits/stl_vector.h dopo che ha incluso altri file di dettaglio di implementazione, incluso quello che definisce std::max.

+0

Ehi, ho aggiunto un po 'più di spiegazione su questo errore nel post principale, im usando #include ma poi quando il vettore chiama quell'intestazione questo quando ottengo l'errore del compilatore. – user977480

9

Questo può essere causato dal preprocessore che danneggia il codice, probabilmente perché è stata definita la macro max. Questo può accadere con la libreria C, perché in generale lo standard C consente alle funzioni della libreria standard C di essere effettivamente macro (anche se ho visto solo un contrattempo su MSVC).

Per controllare, è possibile

  • pre-elaborazione della sorgente con gcc -E e cercare l'uscita per il codice corrispondente. Controlla se non è danneggiato.
  • aggiungere una riga #undef max prima di #include <vector> e vedere se è utile.
+3

Grazie, il #undef max ha risolto il problema:) – user977480

+1

Questo mi ha salvato, stavo usando il codice di qualcun altro e non avevo idea di cosa stesse succedendo. – diedthreetimes

+0

Questo risolve il mio problema. Ottenere lo stesso errore in Linux g ++. Ciò era dovuto alla macro "max" è definita nel mio codice. Questo errore scompare, dopo aver rinominato questa macro. – rashok

Problemi correlati