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

Как справиться с слишком длинным протоколом ошибок шаблона STL?

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

<ns::type<ns::type<ns::type, ns::type<...><ns::type<...> > > > >

Я ищу некоторый флаг компилятора, трюк, обходной путь или методологию (в настоящее время я копирую прошлую ошибку и накладываю две строки на то, что у меня есть и какой компилятор хочет использовать и удалять закладки переменных... (процедура рода грубая для не очень-то необычный ctrl + s не выполняется)), что могло бы сделать эту задачу более быстрой или просто помогать мне (хотя бы только синтаксис синтаксиса ошибки IDE...)

4b9b3361

Ответ 1

STLFilt: дешифратор сообщений STL для С++ - популярный инструмент для фильтрации этих подробных сообщений об ошибках и превращения их в нечто более разборчивое.

На своем веб-сайте:

STLFilt был первоначально задуман как учебное пособие, чтобы позволить учащимся проведение семинаров на C++ и/или STL, чтобы иметь смысл типично сообщения об ошибках с превышением STL. Сегодня, однако, даже некоторые эксперты С++ приняли STLFilt для использования в повседневном развитии. Результаты могут не всегда совершенны, но большую часть времени потерянная информация во время дешифрования не имеет решающего значения для отлаживаемого приложения. В остальное время расшифровка достаточно проста, чтобы обойти.

Распределение для каждой платформы (набор компиляторов/библиотек) самодостаточны и настроены на особенности этой платформы. каждый Perl script выполняет базовые регулярные выражения для всех стандартных (и расширенные, если они присутствуют в библиотеке) компоненты STL, в то время как некоторые версии script идут дальше в отношении сообщения упорядочение, обертка строк, обработка ошибок заголовка библиотеки и т.д., так как я в одностороннем порядке считается подходящей для этой платформы.

Здесь демонстрационный прогон, который показывает, как это может быть полезно:

Исходная программа:

#include <map>
#include <algorithm>
#include <cmath>

const int values[] = { 1,2,3,4,5 };
const int NVALS = sizeof values / sizeof (int);

int main()
{
    using namespace std;

    typedef map<int, double> valmap;

    valmap m;

    for (int i = 0; i < NVALS; i++)
        m.insert(make_pair(values[i], pow(values[i], .5)));

    valmap::iterator it = 100;              // error
    valmap::iterator it2(100);              // error
    m.insert(1,2);                          // error

    return 0;
}

Во-первых, нефильтрованный прогон с использованием компилятора MinGW gcc 3.2:

d:\src\cl\demo>c++2 rtmap.cpp
rtmap.cpp: In function `int main()':
rtmap.cpp:19: invalid conversion from `int' to `
   std::_Rb_tree_node<std::pair<const int, double> >*'
rtmap.cpp:19:   initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref,
   _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val =
   std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr =
   std::pair<const int, double>*]'
rtmap.cpp:20: invalid conversion from `int' to `
   std::_Rb_tree_node<std::pair<const int, double> >*'
rtmap.cpp:20:   initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref,
   _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val =
   std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr =
   std::pair<const int, double>*]'
E:/GCC3/include/c++/3.2/bits/stl_tree.h: In member function `void
   std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::insert_unique(_II,

   _II) [with _InputIterator = int, _Key = int, _Val = std::pair<const int,
   double>, _KeyOfValue = std::_Select1st<std::pair<const int, double> >,
   _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int,
   double> >]':
E:/GCC3/include/c++/3.2/bits/stl_map.h:272:   instantiated from `void std::map<_
Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _Input
Iterator = int, _Key = int, _Tp = double, _Compare = std::less<int>, _Alloc = st
d::allocator<std::pair<const int, double> >]'
rtmap.cpp:21:   instantiated from here
E:/GCC3/include/c++/3.2/bits/stl_tree.h:1161: invalid type argument of `unary *
   '

И отфильтрованный прогон с использованием gcc-специфического прокси С++:

d:\src\cl\demo>c++ rtmap.cpp
  *** {BD Software Proxy c++ for gcc v3.01} STL Message Decryption is ON! ***
rtmap.cpp: In function `int main()':
rtmap.cpp:19: invalid conversion from `int' to `iter'
rtmap.cpp:19:   initializing argument 1 of `iter(iter)'
rtmap.cpp:20: invalid conversion from `int' to `iter'
rtmap.cpp:20:   initializing argument 1 of `iter(iter)'
stl_tree.h: In member function `void map<int,double>::insert_unique(_II, _II)':
    [STL Decryptor: Suppressed 1 more STL standard header message]
rtmap.cpp:21:   instantiated from here
stl_tree.h:1161: invalid type argument of `unary *'

STL Decryptor reminder:
    Use the /hdr:L option to see all suppressed standard lib headers

[Примечание: демонстрационные прогоны выполнялись в консольном окне с 80 колонками с Включена обтекаемая интеллектуальная линия STLFilt и внутренняя переключатели, предназначенные для создания сообщений как можно более краткими. Более подробно доступный путем адаптации параметров Decryptor.]

Единственный недостаток, который я вижу, заключается в том, что он помещает Стандартную библиотеку С++.: (

Здесь соответствующая статья журнала автором STLFilt.

Ответ 2

Несколько человек сделали инструменты для выполнения этого, так как там ничего не создано. Тонны в Google, но вернет верхний результат: http://www.bdsoft.com/tools/stlfilt.html

Он должен быть совместим с visual studio и gcc.

изменить::

Мне нужно ввести меньше, чтобы на самом деле получить ввод во времени:)