解密C ++模板错误消息

解密C ++模板错误消息

Deciphering C++ template error messages

我真的开始理解人们所说的C ++错误消息对于模板而言非常糟糕的含义。 对于像函数不匹配其原型这样的简单事件,我已经看到了可怕的长错误。

有什么技巧可以解密这些错误?

编辑:我同时使用gcc和MSVC。 他们俩似乎都非常糟糕。


您可以尝试使用以下工具使事情更加理智:

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


我肯定不会。小错误会爆炸成几页,成堆的页面不可读。通常在早上喝咖啡之前。 :(

我唯一的建议是深呼吸,从顶部开始,然后尝试解析重要的信息。 (我知道,说起来容易做起来难,对吧?)。


正如@nsanders所说,STLFilt是一个很好的解决方案。自行开发的STLFilt(当您不想麻烦安装Perl时)是在编辑器中复制错误消息,并开始替换部分错误,直到变得(更)易于管理。

例如

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

用不太怪异的术语表示:

更换:

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

带有:

1
string

一些编译器比其他编译器提供更好的消息。您正在使用什么编译器?话虽如此,他们都很糟糕。 C ++ 0X可以解决大多数问题(请参阅概念),但是该标准要到2009年才能发布,而广泛的支持可能要晚于:-(


至少在Visual Studio中,"输出生成"窗口而不是"错误列表"中提供了更多信息。我在"错误列表"状态下遇到模板错误,"无法将Foo 转换为Foo "。在"输出"窗口中的实际错误后面有几行内容,帮助我理解了实际??的问题。


即使帖子过旧,这也可能对其他绊倒这篇文章的人有所帮助。

我遇到了完全相同的问题,因为我的错误太长,甚至无法将其打印到屏幕上。因此,我将它们转储到文本文件中,并尝试使用文本编辑器进行一些基本搜索,而不是遍历文件,其中一些文件大小可能高达20 MB(对于错误而言这并不坏)。当我并行编译时,大多数错误将被复制,因此这是另一个巨大的问题。

当我对这种方法感到厌倦(而且效率也不高)时,我开发了一个小型帮助程序,可以直接将其链接到我的编译器工具链中,以便可以根据某些规则来格式化由编译器生成的任何输出在json文件中定义。该程序可以在这里找到:https://github.com/tomrobin-teschner/dotify

有三个基本功能:

  • 如果编译器包含某个字符串,请不要打印当前输出(行)
  • 仅在包含关键字(可以彩色显示)的特定行时打印
  • 如果涉及模板,请除去<>括号之间的内容,然后将其替换为圆点。因此,例如,MyClass, std::array>将简单地由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格式),在非常简单的情况下,它看起来可能像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
 "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)上找到选项和解释的完整列表。


推荐阅读