Ответ 1
Это действительно ошибка с Eclipse CDT (более конкретно, инструмент CODAN для анализа кода Eclipse). Существует отчет bug и он был исправлен и должен быть доступен из CDT 8.3.0, который в феврале 2014 года.
Я написал оператор < < для моего шаблонного класса:
template<class T>
std::ostream& operator<<(std::ostream &strm, const MyClass<T> &obj)
и когда я пишу
cout << myClassInstance << endl;
это компилируется и запускается, но мой Eclipse CDT говорит:
Недопустимая перегрузка 'endl'
Почему это мне говорит?
(Я использую Eclipse CDT Kepler на Win7 64 бит с Cygwin gcc)
Это действительно ошибка с Eclipse CDT (более конкретно, инструмент CODAN для анализа кода Eclipse). Существует отчет bug и он был исправлен и должен быть доступен из CDT 8.3.0, который в феврале 2014 года.
Я тоже получал эту ошибку.
//print the value
cout << rt->element << endl;
Простое изменение на:
//print the value
cout << rt->element;
cout << endl;
удалил ошибку для меня. Новое на С++, но похоже, что вам также необходимо перегрузить < < для myClassInstance. Если вы хотите использовать оригинальный метод.
Проблема (насколько я понимаю) с инструментом анализа кода Eclipse.
Если вам нравится, вы можете избежать этого сообщения, полностью отключив проверку недопустимых перегрузок:
Затем вы увидите, что ошибка исчезла.
Однако он может пропустить настоящие ошибки, и было бы лучше, если бы он остался включенным, но используйте кнопку "Настроить выбранные", чтобы изменить уровень серьезности.
Я изменил его на "ПРЕДУПРЕЖДЕНИЕ" вместо "ОШИБКА".
Как сказал @plasmaHH, я думаю, что Eclipse не смог правильно проанализировать С++ в этом сценарии.
хотя это старый вопрос, для будущих посетителей, вещь, заставившая ошибку уйти для меня, просто использовала полностью квалифицированный cout и endl:
std::cout << thing << std::endl
Не знаю, почему Eclipse жалуется на него, поскольку он компилируется и работает отлично, если пространство имен не находится в этом конкретном месте в коде.
попробуйте поставить std:: endl вместо endl или перегрузка внутри вашего класса в качестве участника:
template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
std::cout << f;
return *this;
}
Это происходит со мной, когда я обновляю затмение. Он имеет всю странную ошибку Member declaration not found
, invalid overload of endl
, Invalid arguments ...
. Теперь я понял, что это информация в рабочей области, а старые проекты не были обновлены для нового CDA-кодона.
У кого-то такая же проблема после обновления затмения или копирования рабочих областей на новую платформу. На самом деле это очень легко решить: Project->C/C++ index->Rebuild
. После этого все странные ошибки исчезнут.
Я знаю, что это старый вопрос, но я столкнулся с аналогичной проблемой с Eclipse Neon (v4.6.0) на Ubuntu 16.04 LTS
Мой код:
stringstream l_Buffer;
l_Buffer << "test" << endl;
const char* l_Temp = l_Buffer.str().c_str();
eclipse сообщил о 3 ошибках:
Я попробовал кучу вещей, перестроил индекс, возился с инструментом анализа кода (настраивал его так же, как и моя сборка), и писал std::endl
... Все безрезультатно.
То, что зафиксировало все три ошибки в моем случае, было заменой
stringstream l_Buffer;
с:
basic_stringstream<char> l_Buffer;
Примечание: Ctrl + Щелчок stringstream
приводит к определению typedef в iosfwd.h
, которое:
/// Class for @c char mixed input and output memory streams.
typedef basic_stringstream<char> stringstream;