Vraag Eclipse klaagt: "Ongeldige overbelasting van 'endl'" - maar de code compileert


Ik heb een operator << geschreven voor mijn template-les:

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

en wanneer ik schrijf

cout << myClassInstance << endl;

dit compileert en wordt uitgevoerd, maar mijn Eclipse CDT zegt:

Ongeldige overbelasting van 'endl'

Waarom vertelt het me dat?

(Ik gebruik Eclipse CDT Kepler op Win7 64bit met Cygwin gcc)


19
2017-07-16 10:49


oorsprong


antwoorden:


Dit is inderdaad een bug met Eclipse CDT (meer bepaald het CODAN-code-analyseprogramma van Eclipse). Er bestaat kever rapport en het is geweest vast en zou beschikbaar moeten zijn vanaf CDT 8.3.0 die in februari 2014 zal zijn.


12
2018-02-16 03:39



Ik kreeg deze fout ook.

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

Een eenvoudige verandering in:

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

de fout voor mij verwijderd. Nieuw bij C ++, maar het lijkt erop dat je ook << moet overslaan voor myClassInstance. Als u de originele methode wilt gebruiken.


13
2017-09-17 00:29



Het probleem is (zoals ik het begrijp) met de Code Analysis-tool van Eclipse.

Als u wilt, kunt u dit bericht vermijden door de controle voor ongeldige overbelastingen volledig uit te schakelen:

  1. Open Voorkeuren Venster (vanuit hoofdmenu Venster \ Voorkeuren)
  2. Ga naar C / C ++ -> Code-analyse
  3. Aan het rechterdeelvenster zie 'Syntaxis en semantische fouten' "Ongeldige overbelasting"
  4. Schakel het selectievakje uit
  5. druk op OK

Dan zult u zien dat de fout verdwenen is.

Het kan echter de echte fouten overslaan en het is misschien beter om het gecontroleerd te laten blijven, maar gebruik de "Customize Selected" knop om het severity-niveau te wijzigen.

Ik heb het veranderd naar "WARNING" in plaats van "ERROR".

Zoals @plasmaHH zei, denk ik dat Eclipse de C ++ niet correct in dit scenario kon ontleden.


10
2017-10-20 03:53



Ik weet dat dit een oude vraag is, maar ik ben een soortgelijk probleem tegengekomen met Eclipse Neon (v4.6.0) op Ubuntu 16.04 LTS

Mijn code was:

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

eclipse heeft 3 fouten gemeld:

  • Ongeldige overbelasting van 'endl'
  • Methode 'c_str' kon niet worden opgelost
  • Methode 'str' kon niet worden opgelost

Ik heb een heleboel dingen uitgeprobeerd, de index opnieuw opgebouwd, geknutseld met de Code Analysis-tool (deze op dezelfde manier configureren als mijn build) en geschreven std::endl... Het mocht allemaal niet baten.

Het ding dat alle drie fouten in mijn geval repareerde was door te vervangen

stringstream l_Buffer;

met:

basic_stringstream<char> l_Buffer;

Opmerking: Ctrl + klikken stringstream leidt u naar de typedefinitie in iosfwd.h welke is:

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

1
2017-07-07 13:59



U kunt proberen de opmerking toe te voegen // @suppress("Invalid overload") zoals in de volgende regel:

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

Dit onderdrukt dat probleem en houdt de mogelijkheid om andere mogelijke ongeldige overbelastingen ergens in de code te detecteren.

Btw, als je op de bug aan de linkerkant van de editor klikt, zal Eclipse dat voor je doen. (Eclipse: Oxygen).


1
2018-06-08 10:26



ook al is het een oude vraag, voor toekomstige bezoekers, het ding maakte de fout weg voor mij was gewoon gebruik van volledig gekwalificeerde cout en endl:

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

Niet zeker waarom Eclipse daar klaagt, omdat het compileert en prima werkt zonder naamruimten op die specifieke plek in code.


0
2017-10-30 10:21



probeer std: endl in plaats van endl of overbelasting binnen je klas als lid:

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

0
2017-10-30 10:41