C++:如何阻止编译器使用大模板参数发送垃圾邮件错误?

标签 c++ compiler-errors g++

在我的 C++ 代码中,它在很大程度上依赖于模板元编程,我有类似的东西:

template <int TFoo, int TBar, int TBaz, int TQux, typename TSpam>
struct MyClassConfig {
    static int const Foo = TFoo;
    static int const Bar = TBar;
    static int const Baz = TBaz;
    static int const Qux = TQux;
    using Spam = TSpam;
};

template <typename Config>
class MyClass {
    ...
};

也就是说,我使用虚拟类来包含各种参数。在这里,通常有很多嵌套,所以 MyClassConfig::Spam又可以是这样的配置类。

这一切都有效,直到编译器 (g++) 决定它不喜欢我的代码。此时它会愉快地打印出整个MyClassConfig。在任何机会它得到。结合使用的其他形式的元编程,错误消息会激增至数兆字节。

编辑 为了更清楚地说明发生了什么,请参阅 my actual codea typical error output .第一个链接指向我的巨型配置类型,别名为 PrinterParams然后将其作为模板参数提供给 PrinterMain<> .看看错误输出是如何由这种配置类型组成的 99% 被吹得满满当当。我相信如果只有 PrinterParams 错误会更具可读性将以别名形式保留,而不是被编译器扩展。

最佳答案

使用您可以获得的最新版本的 GCC。 GCC 人员大大改进了他们的错误消息。特别是 4.8 对它们进行了更好的格式化, future 的 4.9 为其增添了色彩。回顾过去,我想知道我如何使用 GCC 4.4 或更早版本。

如果你可以切换到 clang,它们会有更好的错误消息。 Clang 是 GCC 改进错误消息的主要插入力。

但就您而言,我认为罗伯特·哈维是对的。您的示例看起来像是滥用模板。

关于C++:如何阻止编译器使用大模板参数发送垃圾邮件错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960460/

相关文章:

c++ - 构建交叉编译器

c++ - 通过 main 传递文件位置?

java - 如何编写可在 Java 和 C++ 中解析的脚本

java - ArrayList 编译错误

java - “找不到符号”或“无法解析符号”错误是什么意思?

PHP 正则表达式 "Unknown modifier p"

c++ - InitializeCriticalSectionEx 不在 KERNEL32.Dll 中

c++ - 如何将 SWIG 用于 STL map ?

c++ - 在不破坏严格别名的情况下高效生成字节缓冲区

c++ - Ubuntu 编译器 (C++)