Eclipse si lamenta: “non Valido sovraccarico di ‘endl’” – ma il codice di compilazione

Ho scritto un operatore<< per la mia classe basata su modelli:

template<class T>
std::ostream& operator<<(std::ostream &strm, const MyClass<T> &obj)

e quando scrivo

cout << myClassInstance << endl;

questo viene compilato ed eseguito, ma il mio Eclipse CDT dice:

Non valido sovraccarico di ‘endl’

Perché mi dicono che?

(Io uso Eclipse CDT Kepler su Win7 64bit con Cygwin gcc)

  • Questo probabilmente sarebbe un problema di indicizzazione. Tenta di ricostruire l’indice e controllare le impostazioni indice sotto WindowPreferencesC/C++Indexer
  • Le impostazioni sembrano bene, e la re-indicizzazione non è d’aiuto.
  • Non vi sono informazioni sufficienti per dare più assistenza.
  • ricordate che eclipse non sono in grado di analizzare il c++
  • Ho lasciato qualcosa?
  • Ma questo non l’autorizza’ per segnalare un errore; in più un avvertimento…
  • Si può sempre ignorare. Se il tuo ragionamento fosse valido, allora non dovrebbe parlare di qualsiasi cosa come un errore, dato che potrebbe essere sbagliato…
  • Ottengo lo stesso errore durante la compilazione di codice C++ in Eclipse utilizzando il compilatore MinGW. Tuttavia, quando ho compilarlo al console con MinGW del compilatore C++ (4.8.1) non ottengo nessun errore. Così dovrebbe essere circa di indicizzazione come Jesse ha detto Bene.
  • Posso solo riprodurre questo CDT 9 avendo un altro errore di sintassi più in alto nel codice. Nel mio caso, ho provato a chiamare un auto variabile che ho intenzione di essere un numero intero, come se si trattasse di un metodo.

InformationsquelleAutor einpoklum | 2013-07-16



8 Replies
  1. 12

    Questo è davvero un bug con Eclipse CDT (più precisamente di Eclipse strumento di Analisi del Codice CODAN). C’è bug rapporto ed è stato fisso e dovrebbe essere disponibile dal CDT 8.3.0 che è dovuto febbraio 2014.

    • Sto correndo CDT 8.4 e sto ancora vedendo questo problema.
    • Stesso problema in 8.4.0.201406111759
    • Stesso problema in 8.5, estremamente fastidioso.
    • Ancora lì, nel 2017!
    • Quasi nel 2018 e ancora… 🙁
  2. 13

    Mi è stato sempre questo errore.

    //print the value
    cout << rt->element << endl;

    Una semplice modifica:

    //print the value
    cout << rt->element;
    cout << endl;

    rimosso l’errore per me. Nuovo per C++, ma sembra che hai anche bisogno di sovraccarico << per myClassInstance. Se si desidera utilizzare il metodo originale.

    • Corretto, elemento di classe avrebbe bisogno di sovraccarico operator<<().
  3. 11

    Il problema è che (a quanto ho capito) con lo strumento di Analisi del Codice di Eclipse.

    Se si desidera, è possibile evitare questo messaggio di disabilitare completamente il controllo non sovraccarichi:

    1. Aprire la Finestra Preferenze (dalla Finestra del menu principale\Preferenze)
    2. Vai a C/C++ -> Analisi del Codice
    3. Nel riquadro a destra vedi “Sintassi e Semantica Errori” | non Valido “Sovraccarico”
    4. Deselezionare la casella di controllo
    5. Premere OK

    Poi si vedrà che l’errore è scomparso.

    Comunque potrebbe saltare i veri errori e potrebbe essere meglio lasciar stare controllato, ma l’uso “Personalizzare Selezionato” pulsante per cambiare il suo livello di gravità.

    Ho cambiato “AVVERTIMENTO” al posto di “ERRORE”.

    Come @plasmaHH detto, credo che Eclipse non hanno potuto analizzare il C++ correttamente in questo scenario.

  4. 1

    So che questa è una vecchia questione, ma ho incontrato un problema simile con Eclipse Neon ( v4.6.0 ) su Ubuntu 16.04 LTS

    Il mio codice è:

    stringstream l_Buffer;
    l_Buffer << "test" << endl;
    const char* l_Temp = l_Buffer.str().c_str();

    eclipse segnalati 3 errori:

    • Non valido sovraccarico di ‘endl’
    • Metodo c_str’ non può essere risolto
    • Metodo ‘str’ non può essere risolto

    Ho provato un sacco di roba, la ricostruzione dell’indice, a spippolare con lo strumento di Analisi del Codice (configurazione, allo stesso modo, come la mia generazione), e la scrittura std::endl… senza nessun risultato.

    La cosa che fissa tutti e tre errori nel mio caso era sostituendo

    stringstream l_Buffer;

    con:

    basic_stringstream<char> l_Buffer;

    Nota: Ctrl + Clic stringstream conduce alla sua typedef definizione in iosfwd.h che è:

    ///Class for @c char mixed input and output memory streams.
    typedef basic_stringstream<char>    stringstream;
    • Fare questo in una nuova domanda per favore (e il link a questo nell’articolo).
  5. 1

    Si può provare ad aggiungere il commento //@suppress("Invalid overload") come nella riga seguente:

    cout << "SOME TEXT" << endl; //@suppress("Invalid overload")

    Questo modo si evita il problema, mantenendo ancora la capacità di rilevare altri possibili voci di sovraccarichi da qualche parte nel codice.

    Btw, se si fa clic sul bug sul lato sinistro dell’editor di Eclipse farà per voi. (Eclipse: Ossigeno).

  6. 0

    anche se è una vecchia questione, per i futuri visitatori, la cosa fece l’errore di andare via per me è stato semplicemente utilizzare pienamente qualificato cout e endl:

    std::cout << thing << std::endl

    Non so perché, Eclipse si lamenta, come si compila e funziona bene senza spazi dei nomi in quel luogo in particolare nel codice.

  7. 0

    prova a mettere std::endl invece di endl
    o sovraccarico interno della vostra classe, come un membro:

    template<class T>
    MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
      std::cout << f;
      return *this;
    }
    • Non stavo chiedendo consigli su come evitare il messaggio, ma per una spiegazione del perché questo sta accadendo…
  8. 0

    Questo è già accaduto a me quando faccio l’aggiornamento dell’eclipse. Ha tutte le strane errore di Member declaration not found, invalid overload of endl, Invalid arguments .... Ora ho capito che è l’info nell’area di lavoro e i vecchi progetti non erano up-to-date per il nuovo CDT codan.

    Per qualcuno ha lo stesso problema dopo l’aggiornamento di eclipse o la copia di aree di lavoro per la nuova piattaforma. In realtà è molto facile da risolvere: Project->C/C++ index->Rebuild. Dopo che è fatto, tutti strani errori andrà via.

Lascia un commento