我只是偶然发现了这个完全相同的问题。我们正在讨论的代码是Contraction Hierarchies implementation by KIT 的一部分。
这是尝试使用 gcc 4.8 编译代码时出现的唯一编译错误。
@vitaut 建议的修复是完成这项工作所需要的。但是请注意,main.cpp 中已经存在以下几行:
// doesn't look nice, but required by the compiler (gcc 4)
...
const EliminationWeight::Type EliminationWeight::MAX_VALUE;
const EliminationWeight::Type EliminationWeight::MIN_VALUE;
如果您决定创建一个 EliminationWeight.cpp 文件以与您的 EliminationWeight.h 一起使用并将其包含在 Makefile 中,那么这些行就是您看到与上述不同的错误的原因:
main.cpp:86:31: error: uninitialized const ‘EliminationWeight::MAX_VALUE’ [-fpermissive]
const EliminationWeight::Type EliminationWeight::MAX_VALUE;
^
main.cpp:87:31: error: uninitialized const ‘EliminationWeight::MIN_VALUE’ [-fpermissive]
const EliminationWeight::Type EliminationWeight::MIN_VALUE;
^
解决方案是要么删除 main.cpp 中的这些行,要么将它们用于实际初始化。我选择了后者,现在的线条看起来像这样:
const EliminationWeight::Type EliminationWeight::MAX_VALUE = std::numeric_limits< EliminationWeight::Type >::max();
const EliminationWeight::Type EliminationWeight::MIN_VALUE = -std::numeric_limits< EliminationWeight::Type >::max();
请注意,我已将std::numeric_limits 模板用于EliminationWeight::Type typedef 定义的类型。这意味着我们只需要更改 typedef 以使用不同的类型。
但是,在 main.cpp 中使用这些要求我们包含 numeric_limits 模板的标头。它在不包含标题的情况下也对我有用,但这可能是因为它是通过其他一些包含的文件包含的。为了干净的代码,无论如何我们都应该包含它。
#include <limits>
另请注意,C++11 为 numeric_limits 模板提供了一个新函数 lowest,这意味着您可以将最后一行替换为以下内容:
const EliminationWeight::Type EliminationWeight::MIN_VALUE = std::numeric_limits< EliminationWeight::Type >::lowest();
但是,C++ reference on lowest 将浮点类型的返回值指定为
依赖于实现;通常,max() 的负数
所以我不确定你是否通过使用这个功能获得了很多。它确实为您提供了看起来更清晰的代码,但似乎返回值有些未指定。