web-dev-qa-db-fra.com

Eclipse se plaint: "Surcharge non valide de 'endl'" - mais le code est compilé

J'ai écrit un opérateur << pour ma classe basée sur un modèle:

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

et quand j'écris

cout << myClassInstance << endl;

cela compile et fonctionne, mais mon CDT Eclipse dit:

Surcharge invalide de 'endl'

Pourquoi ça me dit ça?

(J'utilise Eclipse CDT Kepler sur Win7 64bit avec Cygwin gcc)

21
einpoklum

Il s'agit en effet d'un bogue avec Eclipse CDT (plus précisément l'outil d'analyse de code Eclipse, CODAN). Il y a bug report et il a été corrigé et devrait être disponible à partir de CDT 8.3.0, prévu pour février 2014.

12
iNFINITEi

J'avais aussi cette erreur.

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

Un simple changement à:

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

enlevé l'erreur pour moi. Nouveau en C++, mais il semble que vous deviez également surcharger << pour myClassInstance. Si vous souhaitez utiliser la méthode d'origine.

13
frmdstryr

Le problème est (si j'ai bien compris) avec l'outil d'analyse de code d'Eclipse.

Si vous le souhaitez, vous pouvez éviter ce message en désactivant complètement le contrôle des surcharges non valides:

  1. Ouvrir la fenêtre Préférences (à partir du menu principal Fenêtre\Préférences)
  2. Aller à C/C++ -> Analyse de code
  3. Dans le volet de droite, voir "Erreurs de syntaxe et de sémantique" | "Surcharge invalide"
  4. Décocher la case à cocher
  5. Appuyer sur OK

Ensuite, vous verrez que l'erreur a disparu. 

Cependant, il peut ignorer les vraies erreurs et il peut être préférable de le laisser rester vérifié, mais utilisez le bouton "Personnaliser la sélection" pour modifier son niveau de gravité.

Je l'ai changé en "AVERTISSEMENT" au lieu de "ERREUR". 

Comme @plasmaHH l'a dit, je pense qu'Eclipse ne pourrait pas analyser correctement le C++ dans ce scénario.

10
phoad

Je sais que c’est une vieille question, mais j’ai rencontré un problème similaire avec Eclipse Neon (v4.6.0) sur Ubuntu 16.04 LTS

Mon code était: 

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

Eclipse a signalé 3 erreurs:

  • Surcharge invalide de 'endl'
  • La méthode 'c_str' n'a pas pu être résolue
  • La méthode 'str' n'a pas pu être résolue

J'ai essayé un tas de choses, en reconstruisant l'index, en manipulant l'outil d'analyse de code (en le configurant de la même manière que ma construction) et en écrivant std::endl... Tout en vain.

La chose qui a résolu les trois erreurs dans mon cas était en remplaçant

stringstream l_Buffer;

avec:

basic_stringstream<char> l_Buffer;

Remarque: Ctrl + Clic sur stringstream vous mène à sa définition de typedef dans iosfwd.h qui est: 

/// Class for @c char mixed input and output memory streams.
typedef basic_stringstream<char>    stringstream;
1
Dargazo

Vous pouvez essayer d'ajouter le commentaire // @suppress("Invalid overload") comme dans la ligne suivante:

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

Cela supprimera ce problème, tout en maintenant la possibilité de détecter d’autres surcharges non valides possibles quelque part dans le code. 

Au fait, si vous cliquez sur le bogue à gauche de l'éditeur, Eclipse le fera pour vous. (Eclipse: Oxygène).

1
dsenic2000

même si c'est une vieille question, pour les futurs visiteurs, ce qui m'a fait perdre l'erreur, c'est simplement d'utiliser des couts et des endl pleinement qualifiés:

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

Vous ne savez pas pourquoi Eclipse se plaint là-bas, car il compile et fonctionne correctement sans espaces de noms à cet endroit particulier du code.

0
uiron

Cela continue de m'arriver lorsque je mets à niveau l'Eclipse. Il a toutes les étranges erreurs de Member declaration not found, invalid overload of endl, Invalid arguments .... Maintenant, j'ai compris qu'il s'agissait d'informations dans l'espace de travail et que les anciens projets n'étaient pas à jour pour le nouveau codan CDT.

Pour quelqu'un qui a le même problème après la mise à niveau d'Eclipse ou la copie d'espaces de travail sur une nouvelle plate-forme. Il est en fait très facile à résoudre: Project->C/C++ index->Rebuild. Après cela, toutes les erreurs étranges disparaîtront.

0
Wang

essayez de mettre std :: endl au lieu de endl ou de surcharger votre classe en tant que membre:

template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
  std::cout << f;
  return *this;
}
0
Dr. Debasish Jana