Расшифровка сообщений об ошибках шаблона C++

Я действительно начинаю понимать, что люди имеют в виду, когда говорят, что сообщения об ошибках C++ ужасны по отношению к шаблонам. Я видел ужасно длинные ошибки для таких простых вещей, как функция, не соответствующая своему прототипу.

Есть ли какие-нибудь уловки для расшифровки этих ошибок?

Обновлено: я использую как gcc, так и MSVC. Они оба кажутся довольно ужасными.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
30
0
9 405
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Вы можете попробовать следующий инструмент, чтобы сделать вещи более разумными:

http://www.bdsoft.com/tools/stlfilt.html

Некоторые компиляторы передают сообщения лучше, чем другие. Какой компилятор вы используете? Сказав это, все они довольно плохие. C++ 0X исправит большую часть этой проблемы (см. концепции), но стандарт не будет выпущен до 2009 года, а широкая поддержка, вероятно, будет даже позже :-(

-1 Они пока не поддаются расшифровке; может быть, не так неразборчиво, как раньше, но все же ужасно!

artless noise 12.04.2013 22:50

Да, я сейчас борюсь с одним. Их так сложно разобрать визуально!

Juno Woods 13.09.2013 21:40

В C++ 11 концепции не вошли.

user146043 15.04.2014 01:53

Спустя 8 лет концепции теперь написаны на C++ 17. Как они собираются помочь в расшифровке ошибок шаблона?

dashesy 23.06.2017 20:38

Я, черт возьми, не могу. Небольшие ошибки превращаются в страницы и страницы нечитаемого мусора. Обычно рано утром, перед кофе. :(

Мой единственный совет - сделать глубокий вдох, начать сверху и попытаться проанализировать важную информацию. (Я знаю, легче сказать, чем сделать, правда?).

По крайней мере, в Visual Studio больше информации дается в окне "Выходная сборка", а не в списке ошибок. У меня была ошибка шаблона в состоянии списка ошибок: «Невозможно преобразовать Foo <int> в Foo <int>». После фактической ошибки в окне вывода было несколько строк, которые помогли мне понять, в чем была настоящая проблема.

Как сказал @ Нсандерс, STLFilt - хорошее решение. Самостоятельный STLFilt (когда вы не хотите утруждать себя установкой Perl) - это скопировать сообщение об ошибке в редактор и начать заменять части ошибки, пока она не станет (более) управляемой.

например

s/std::basic_string<char,std::char_traits<char>,std::allocator<char>>/string/g 

Проще говоря, это означает:

Заменять:

std::basic_string<char,std::char_traits<char>,std::allocator<char>>

С:

string

Это более полезно, чем кажется. Не стесняйтесь ограничивать информационную перегрузку человеческого мозга - ведь здесь меньше различий между людьми, чем они хотели бы признать. Мы все можем сопоставить примерно одинаковое количество шаблонов одновременно - хитрость состоит в том, чтобы постепенно научиться сопоставлять более крупные шаблоны.

breakpoint 10.05.2017 21:09

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

У меня была точно такая же проблема, в моем случае ошибки даже не могли быть выведены на экран, поскольку они были слишком длинными. Поэтому я скопировал их в текстовый файл и попробовал выполнить базовый поиск с помощью текстового редактора, а не с помощью grep'а по файлу, некоторые из которых могут иметь размер до 20 МБ (неплохо только для ошибки). Большинство ошибок будут дублироваться, поскольку я компилировал параллельно, так что это была еще одна огромная проблема.

Поскольку я устал от этого подхода (а также он был не очень продуктивным), я разработал небольшую вспомогательную программу, которую я мог напрямую связать с моей инструментальной цепочкой компилятора, чтобы любой вывод, сгенерированный компилятором, мог быть отформатирован на основе некоторых правил. определен в файле json. Программу можно найти здесь: https://github.com/tomrobin-teschner/dotify

Есть три основных функции:

  • Не выводить текущий вывод (строку) из компилятора, если он содержит определенную строку
  • Печатайте только определенную строку, если она содержит ключевое слово (которое можно раскрасить)
  • Если используется шаблон, удалите содержимое между скобками <> и замените их точками. Так, например, MyClass<std::vector<double>, std::array<double, 3>> можно просто заменить на MyClass<...>.

Полное сообщение об ошибке по-прежнему сохраняется в файле журнала (и может быть использовано позже, если требуется более подробная информация), синтаксический анализатор работает только с выводом, который выводится на консоль.

Команда для вызова парсера:

/path/to/program | tee log | /path/to/parser -f /path/to/inputFile.json

/path/to/program - это программа для выполнения (и вывод которой должен быть отформатирован) /path/to/parser -f /path/to/inputFile.json, расположение парсера, флаги -f определяют входной файл (в формате json), который для очень простого случая может выглядеть так:

{
  "ignoreCompleteLineIfItContainsSubstring" : [
    "should be suppressed"
  ],
  "ignoreContentBetweenDelimiter" : [
    {
      "startingDelimiter" : "<",
      "endingDelimiter" : ">",
      "replaceContentBy" : "..."
    }
  ],
  "styleLineContainingKeywords" : [
    {
      "keyword" : "error",
      "removeDuplicates" : true,
      "applyStyle" : "onKeyword",
      "color" : "red",
      "style" : "bold"
    }
  ]
}

Полный список опций и пояснения можно найти на сайте проекта (https://github.com/tomrobin-teschner/dotify)

Другие вопросы по теме