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)
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.
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:
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.
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:
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;
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).
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.
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.
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;
}