Я действительно начинаю понимать, что люди имеют в виду, когда говорят, что сообщения об ошибках C++ ужасны по отношению к шаблонам. Я видел ужасно длинные ошибки для таких простых вещей, как функция, не соответствующая своему прототипу.
Есть ли какие-нибудь уловки для расшифровки этих ошибок?
Обновлено: я использую как gcc, так и MSVC. Они оба кажутся довольно ужасными.





Вы можете попробовать следующий инструмент, чтобы сделать вещи более разумными:
Некоторые компиляторы передают сообщения лучше, чем другие. Какой компилятор вы используете? Сказав это, все они довольно плохие. C++ 0X исправит большую часть этой проблемы (см. концепции), но стандарт не будет выпущен до 2009 года, а широкая поддержка, вероятно, будет даже позже :-(
Да, я сейчас борюсь с одним. Их так сложно разобрать визуально!
В C++ 11 концепции не вошли.
Спустя 8 лет концепции теперь написаны на C++ 17. Как они собираются помочь в расшифровке ошибок шаблона?
Я, черт возьми, не могу. Небольшие ошибки превращаются в страницы и страницы нечитаемого мусора. Обычно рано утром, перед кофе. :(
Мой единственный совет - сделать глубокий вдох, начать сверху и попытаться проанализировать важную информацию. (Я знаю, легче сказать, чем сделать, правда?).
По крайней мере, в 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
Это более полезно, чем кажется. Не стесняйтесь ограничивать информационную перегрузку человеческого мозга - ведь здесь меньше различий между людьми, чем они хотели бы признать. Мы все можем сопоставить примерно одинаковое количество шаблонов одновременно - хитрость состоит в том, чтобы постепенно научиться сопоставлять более крупные шаблоны.
Несмотря на то, что это старый пост, он может быть полезен другим людям, наткнувшимся на него.
У меня была точно такая же проблема, в моем случае ошибки даже не могли быть выведены на экран, поскольку они были слишком длинными. Поэтому я скопировал их в текстовый файл и попробовал выполнить базовый поиск с помощью текстового редактора, а не с помощью 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)
-1 Они пока не поддаются расшифровке; может быть, не так неразборчиво, как раньше, но все же ужасно!