在我的 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 code和 a 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/