Eclipse жалуется: "Недопустимая перегрузка endl" - но код компилируется

Я написал оператор<< для моего шаблонного класса:

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

и когда я пишу

cout << myClassInstance << endl;

это компилируется и запускается, но мой Eclipse CDT говорит:

Недопустимая перегрузка 'endl'

Почему это говорит мне это?

(Я использую Eclipse CDT Kepler на Win7 64bit с Cygwin gcc)

8 ответов

Решение

Это действительно ошибка в Eclipse CDT (точнее, в инструменте анализа кода Eclipse CODAN). Есть отчет об ошибках, и он был исправлен и должен быть доступен в CDT 8.3.0, который должен выйти в феврале 2014 года.

Проблема, как я понимаю, в инструменте анализа кода Eclipse.

Если хотите, вы можете избежать этого сообщения, полностью отключив проверку на недопустимые перегрузки:

  1. Открыть окно настроек (из главного меню Окно \ Настройки)
  2. Перейти к C/C++ -> Анализ кода
  3. На правой панели см. "Синтаксические и семантические ошибки" | "Недопустимая перегрузка"
  4. Снимите флажок
  5. Нажмите ОК

Тогда вы увидите, что ошибка исчезла.

Тем не менее, это может пропустить реальные ошибки, и, возможно, лучше оставить этот флажок, но используйте кнопку "Настроить выбранное", чтобы изменить уровень серьезности.

Я изменил его на "ПРЕДУПРЕЖДЕНИЕ" вместо "ОШИБКА".

Как сказал @plasmaHH, я думаю, что Eclipse не смог правильно разобрать C++ в этом сценарии.

Я тоже получал эту ошибку.

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

Простое изменение:

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

убрал ошибку для меня. Новичок в C++, но, похоже, вам также необходимо перегрузить << для myClassInstance. Если вы хотите использовать оригинальный метод.

Вы можете попробовать добавить комментарий // @suppress("Invalid overload") как в следующей строке:

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

Это устранит эту проблему, сохраняя возможность обнаруживать другие возможные недопустимые перегрузки где-то в коде.

Кстати, если вы нажмете на ошибку в левой части редактора, Eclipse сделает это за вас. (Затмение: кислород).

Я знаю, что это старый вопрос, но я столкнулся с аналогичной проблемой с 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();

Затмение сообщило о 3 ошибках:

  • Недопустимая перегрузка 'endl'
  • Метод 'c_str' не может быть разрешен
  • Метод 'str' не может быть разрешен

Я перепробовал кучу вещей, перестроил индекс, возился с инструментом анализа кода (настраивал его так же, как моя сборка) и писал 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;

Это продолжает происходить со мной, когда я обновляю затмение. Это все странные ошибки Member declaration not found, invalid overload of endl, Invalid arguments ..., Теперь я понял, что это информация в рабочей области, и старые проекты не были обновлены для нового CDT-кодана.

У кого-то есть такая же проблема после обновления затмения или копирования рабочих пространств на новую платформу. На самом деле это очень легко решить: Project->C/C++ index->Rebuild, После этого все странные ошибки исчезнут.

Несмотря на то, что это старый вопрос, для будущих посетителей из-за ошибки я просто использовал полностью квалифицированные 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;
}
Другие вопросы по тегам