Вопрос по c++, eclipse-cdt, templates, operator-overloading – Eclipse жалуется: «Недопустимая перегрузка endl» - но код компилируется

22

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

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)

помните, что затмение не может полностью разобрать с ++ PlasmaHH
@JesseGood: я что-то пропустил? einpoklum
Это, вероятно, было бы проблемой индексации. Попробуйте перестроить индекс и проверьте настройки индекса вWindow → PreferencesC/C++Indexer Jesse Good
@JesseGood: настройки кажутся хорошими, и повторная индексация не помогает. einpoklum
Недостаточно информации для оказания дополнительной помощи. Jesse Good

Ваш Ответ

8   ответов
1

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

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

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

0

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

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

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

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

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

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

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

Правильно, класс элемента должен быть перегруженoperator<<(). Matthäus Brandl
11

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

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

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

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

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

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

0

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

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

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

1

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

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

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

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

12

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

Та же проблема в 8.5, очень раздражает. vsoftco
Я использую CDT 8.4 и все еще вижу эту проблему. MrMas
Все еще там в 2017 году! Rexcirus
Та же проблема в 8.4.0.201406111759 Yaroslav Bulatov
Почти в 2018 году и до сих пор ... :( waas1919

Похожие вопросы