如何处理STL模板错误报告过长的方式? 在C++ STL编程时,或集中使用“模板化”,出现一些编译错误,通常错误报告很长,而且常常不需要太多的信息。 我说的是gcc,我不知道与其他编译器是否不同,但有时即使只是一个输入错误,也需要一段时间才能捕捉到清除 <ns::type<ns::type<ns::type, ns::type<...><ns::type<...> > > > >

如何处理STL模板错误报告过长的方式? 在C++ STL编程时,或集中使用“模板化”,出现一些编译错误,通常错误报告很长,而且常常不需要太多的信息。 我说的是gcc,我不知道与其他编译器是否不同,但有时即使只是一个输入错误,也需要一段时间才能捕捉到清除 <ns::type<ns::type<ns::type, ns::type<...><ns::type<...> > > > >,c++,templates,stl,C++,Templates,Stl,我正在寻找一些编译器标志、技巧、解决方法或方法(我目前复制了错误,并将我拥有的和编译器使用的内容放在两行上,然后删除变量书签…(对于一个不太常见的ctrl+s未很好执行的程序来说,这是一个悲哀的过程),这可以使这个任务更快完成,或者只是对我有所帮助(甚至只有一些IDE错误语法高亮显示…是一种常用的工具,可以过滤这些详细的错误消息,并将其转换为更清晰的内容 从他们的网站: STLFilt最初被认为是一种教学辅助工具,允许学生使用 采用C++和/或STL特定的研讨会来进行典型的理解 过多的STL错误

我正在寻找一些编译器标志、技巧、解决方法或方法(我目前复制了错误,并将我拥有的和编译器使用的内容放在两行上,然后删除变量书签…(对于一个不太常见的ctrl+s未很好执行的程序来说,这是一个悲哀的过程),这可以使这个任务更快完成,或者只是对我有所帮助(甚至只有一些IDE错误语法高亮显示…

是一种常用的工具,可以过滤这些详细的错误消息,并将其转换为更清晰的内容

从他们的网站:

STLFilt最初被认为是一种教学辅助工具,允许学生使用 采用C++和/或STL特定的研讨会来进行典型的理解 过多的STL错误消息。但是,今天,甚至一些C++专家。 已在日常开发中采用STLFilt。结果可能 并非总是十全十美的,但大多数时候信息丢失了 在解密过程中,对正在调试的应用程序并不重要。 剩下的时间,解密很容易绕过

每个平台(编译器/库集)的分发是 独立的,并调整到该平台的特质。每个 Perl脚本对所有标准执行基本正则表达式替换 (和扩展,如果库中存在)STL组件,而 脚本的某些版本在消息方面更进一步 订购、换行、库头错误处理等,如I 单方面认为适合该平台

以下是它如何发挥作用的示例:

源程序:

#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;
}
#包括

#STLFilt的作者提供的包含。

一些人已经制作了工具来执行此操作,因为Google上没有内置.t,但最重要的结果是:

它应该与VisualStudio和gcc兼容

编辑::


我需要输入更少的内容才能及时获得输入:)

使用另一个编译器编译通常非常有用。GCC、Visual C++、基于EDG的编译器(如CeMoO或英特尔C++)和CLAN都会产生非常不同的模板编译错误诊断消息。它们都有一些非常有用的诊断信息,也都有一些完全无用的信息。如果您使用多个编译器进行编译,则获得更有用的诊断消息的可能性要大得多。嗯,我会试试。我认为它们很标准,但不是很舒服。虽然这可以从理论上回答这个问题,但可以在这里包括答案的基本部分,并提供链接供参考。@Kev:不过,也许应该为不正确的信息保留否决票,而不是“不恰当的”信息。编辑:而且,这种类比甚至不适用于这个特别的问答。@GMan-我在查看国旗时,甚至没有看到选票扩散。但是,不鼓励只作为链接的答案,我们希望看到它们与用户在另一端可能看到的内容的摘要一起备份。这也给搜索引擎的结果增加了更多的麻烦。@Kev:我不是说有一个摘要不可取,只是人们不应该对它投反对票。不知为什么,没有任何解释说明如何在没有编译器的情况下使用脚本-如果出现错误,显然不想用过滤器重新编译项目。因此,这里就是:
STLfilt
有一个perl脚本来过滤输出,命名为
gSTLFilt.pl
。它从输入端获取一个错误列表,并将结果抛出到输出端;因此,只需将错误保存到文件«errlog»,然后使用命令
cat errlog | perl gSTLFilt.pl
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 *
   '
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