解密C ++模板错误消息

时间:2008-09-07 00:39:39

标签: c++ templates compiler-errors

当他们说C ++的错误消息在模板方面非常糟糕时,我真的开始明白人们的意思了。我已经看到了一些非常长的错误,就像一个与原型不匹配的函数一样简单。

有没有解决这些错误的技巧?

编辑:我正在使用gcc和MSVC。它们似乎都非常糟糕。

6 个答案:

答案 0 :(得分:16)

您可以尝试使用以下工具来使事情变得更加清晰:

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

答案 1 :(得分:8)

我当然不能。小错误会爆炸到不可读垃圾的页面和页面。通常一大早,才喝咖啡。 :(

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

答案 2 :(得分:4)

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

e.g。

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

答案 3 :(得分:3)

有些编译器比其他编译器提供更好的消息。你用的是什么编译器?话虽如此,他们都很糟糕。 C ++ 0X将解决大部分问题(参见concepts),但该标准要到2009年才会发布,广泛的支持可能会晚于此: - (

答案 4 :(得分:2)

至少在Visual Studio中,“输出构建”窗口中提供的信息比“错误列表”更多。我在错误列表状态中遇到了模板错误,“无法将Foo&lt; int&gt;转换为Foo&lt; int&gt;”。 “输出”窗口中的实际错误后面有一些行帮助我解释实际问题是什么。

答案 5 :(得分:1)

即使帖子过旧,这也可能对其他绊脚石的人有所帮助。

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

由于我对这种方法感到厌倦(而且效率也不高),所以我开发了一个小型帮助程序,可以直接将其链接到我的编译器工具链中,以便可以根据以下格式对编译器生成的任何输出进行格式化:根据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)上找到选项和解释的完整列表