c++ templates operator-overloading eclipse-cdt

c++ - Eclipse se queja: "Sobrecarga no válida de ''endl''", pero el código se compila



templates operator-overloading (8)

He escrito un operador << para mi clase de plantilla:

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

y cuando escribo

cout << myClassInstance << endl;

esto se compila y se ejecuta, pero mi CDT de Eclipse dice:

Sobrecarga no válida de ''endl''

¿Por qué me dice eso?

(Utilizo Eclipse CDT Kepler en Win7 64bit con Cygwin gcc)


A pesar de que es una pregunta antigua, para los futuros visitantes, la cosa hizo que el error desapareciera para mí, simplemente fue utilizar cout y endl totalmente calificados:

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

No estoy seguro de por qué Eclipse se queja allí, ya que compila y funciona bien sin espacios de nombres en ese lugar en particular en el código.


El problema es (según entiendo) con la herramienta de análisis de código de Eclipse.

Si lo desea, puede evitar este mensaje desactivando completamente la comprobación de sobrecargas no válidas:

  1. Abrir ventana de preferencias (desde el menú principal Ventana / Preferencias)
  2. Ir a C / C ++ -> Análisis de Código
  3. En el panel derecho, vea "Sintaxis y errores semánticos" | "Sobrecarga inválida"
  4. Desmarque la casilla de verificación
  5. presiona OK

Entonces verás que el error desaparece.

Sin embargo, puede omitir los errores reales y puede ser mejor dejar que se verifique, pero use el botón "Personalizar seleccionado" para cambiar su nivel de gravedad.

Lo he cambiado a "ADVERTENCIA" en lugar de "ERROR".

Como dijo @plasmaHH, creo que Eclipse no pudo analizar el C ++ correctamente en este escenario.


Esto es realmente un error con Eclipse CDT (más específicamente, la herramienta de análisis de código CODAN de Eclipse). Hay un informe de bug y se ha bug y debería estar disponible en CDT 8.3.0, que debe presentarse en febrero de 2014.


Esto me sigue sucediendo cuando actualizo el eclipse. Tiene todos los errores extraños de la Member declaration not found del Member declaration not found , invalid overload of endl , Invalid arguments ... Ahora me di cuenta de que es la información en el área de trabajo y que los proyectos antiguos no estaban actualizados para el nuevo código CDT.

Alguien tiene el mismo problema después de actualizar el eclipse o copiar las áreas de trabajo a una nueva plataforma. En realidad, es muy fácil de resolver: Project->C/C++ index->Rebuild . Una vez hecho esto, todos los errores extraños desaparecerán.


Puede intentar agregar el comentario // @suppress("Invalid overload") como se // @suppress("Invalid overload") en la siguiente línea:

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

Esto eliminará ese problema y mantendrá la capacidad de detectar otras posibles sobrecargas no válidas en algún lugar del código.

Por cierto, si hace clic en el error en el lado izquierdo del editor, Eclipse lo hará por usted. (Eclipse: Oxígeno).


Sé que esta es una pregunta antigua, pero encontré un problema similar con Eclipse Neon (v4.6.0) en Ubuntu 16.04 LTS

Mi código era:

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

Eclipse reportó 3 errores:

  • Sobrecarga no válida de ''endl''
  • El método ''c_str'' no pudo ser resuelto
  • Método ''str'' no pudo ser resuelto

Intenté un montón de cosas, reconstruyendo el índice, jugando con la herramienta de análisis de código (configurándolo de la misma forma que mi compilación), y escribiendo std::endl ... Todo fue en vano.

Lo que solucionó los tres errores en mi caso fue reemplazando

stringstream l_Buffer;

con:

basic_stringstream<char> l_Buffer;

Nota: Ctrl + Al stringstream clic en stringstream lleva a su definición typedef en iosfwd.h que es:

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


Yo también estaba recibiendo este error.

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

Un simple cambio a:

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

eliminado el error para mí. Nuevo en C ++, pero parece que también necesita sobrecargar << para myClassInstance. Si desea utilizar el método original.


intente colocar std :: endl en lugar de endl o sobrecarga dentro de su clase como miembro:

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