Подтвердить что ты не робот

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 64 бит с Cygwin gcc)

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

  • Открыть окно настроек (из главного окна "Окно\Настройки" )
  • Перейти к C/С++ → Анализ кода
  • На правой панели см. "Синтаксис и семантические ошибки" | "Недопустимая перегрузка"
  • Снимите флажок
  • Нажмите OK

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

Однако он может пропустить настоящие ошибки, и было бы лучше, если бы он остался включенным, но используйте кнопку "Настроить выбранные", чтобы изменить уровень серьезности.

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

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

Ответ 4

хотя это старый вопрос, для будущих посетителей, вещь, заставившая ошибку уйти для меня, просто использовала полностью квалифицированный cout и endl:

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

Не знаю, почему Eclipse жалуется на него, поскольку он компилируется и работает отлично, если пространство имен не находится в этом конкретном месте в коде.

Ответ 5

попробуйте поставить std:: endl вместо endl или перегрузка внутри вашего класса в качестве участника:

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

Ответ 6

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

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

Ответ 7

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

  • Неверная перегрузка '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;