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)

 einpoklum16 июл. 2013 г., 15:06
@JesseGood: я что-то пропустил?
 PlasmaHH16 июл. 2013 г., 13:14
помните, что затмение не может полностью разобрать с ++
 Jesse Good16 июл. 2013 г., 12:58
Это, вероятно, было бы проблемой индексации. Попробуйте перестроить индекс и проверьте настройки индекса вWindow → PreferencesC/C++Indexer
 einpoklum16 июл. 2013 г., 13:00
@JesseGood: настройки кажутся хорошими, и повторная индексация не помогает.
 Jesse Good16 июл. 2013 г., 13:04
Недостаточно информации для оказания дополнительной помощи.

Ответы на вопрос(8)

что это старый вопрос, но я столкнулся с аналогичной проблемой с 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;
 einpoklum07 июл. 2016 г., 17:09
Сделайте это новым вопросом, пожалуйста (и ссылку на него в рецензии).

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

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

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

template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
  std::cout << f;
  return *this;
}
 einpoklum31 окт. 2014 г., 15:39
Я спрашивал не о том, как избежать сообщения, а о том, почему это происходит ...

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

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

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

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

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

 Matthäus Brandl28 янв. 2014 г., 16:59
Правильно, класс элемента должен быть перегруженoperator<<().

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

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

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

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

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

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

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

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

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

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

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

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

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

Решение Вопроса

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

 Rexcirus20 июн. 2017 г., 16:21
Все еще там в 2017 году!
 vsoftco07 нояб. 2014 г., 04:49
Та же проблема в 8.5, очень раздражает.
 MrMas08 авг. 2014 г., 18:08
Я использую CDT 8.4 и все еще вижу эту проблему.
 Yaroslav Bulatov31 авг. 2014 г., 22:52
Та же проблема в 8.4.0.201406111759
 waas191914 сент. 2017 г., 13:12
Почти в 2018 году и до сих пор ... :(

Ваш ответ на вопрос