a call to a constructor cannot appear in a constant-expression
当我运行
1 2 3 4 5 6 7 8 9 | $ make build mkdir -m 755 -p obj/Algorithm g++ -Wall -DNO_TIMER -DNO_TRACES -O3 -funroll-loops -finline-functions -fexpensive-optimizations -Isrc -o obj/Algorithm/Algorithm.o -c src/Algorithm/Algorithm.cpp src/Network/Link.h:44:42: error: a call to a constructor cannot appear in a constant-expression static const double METRIC_MIN = 1.0/DBL_MAX; // to prevent metric to be 0 ^ src/Network/Link.h:45:38: error: a call to a constructor cannot appear in a constant-expression static const double METRIC_MAX = DBL_MAX; ^ |
如果我将
1 2 | static const double METRIC_MIN = 1.0/DBL_MAX; // to prevent metric to be 0 static const double METRIC_MAX = DBL_MAX; |
到
1 2 3 4 | static const double METRIC_MIN; // to prevent metric to be 0 double METRIC_MIN = 1.0/DBL_MAX; static const double METRIC_MAX; double METRIC_MAX = DBL_MAX; |
我收到
1 2 | error: ‘double Link::METRIC_MIN’ conflicts with a previous declaration double METRIC_MIN = 1.0/DBL_MAX; |
1 2 | #define METRIC_MIN DBL_MIN #define METRIC_MAX DBL_MAX |
似乎工作得很好
另一个如此问题的答案,你联系不清楚在哪里写的行。我已经编辑了它,希望没有其他人被误导。
若要修复C++ 03中的编译错误,请更改:
1 2 | static const double METRIC_MIN = 1.0/DBL_MAX; // to prevent metric to be 0 static const double METRIC_MAX = DBL_MAX; |
到:
1 2 | static const double METRIC_MIN; // to prevent metric to be 0 static const double METRIC_MAX; |
然后在一个.cpp文件中(只要该文件包含
1 2 | const double Link::METRIC_MIN = 1.0/DBL_MAX; const double Link::METRIC_MAX = DBL_MAX; |
不过,可能还有其他问题。显然,编写此代码的人使用的是一个编译器,该扩展在C++ 11之前将EDCOX1 OR 1作为常量表达式处理。代码的其余部分可能依赖于头中可见的这些常量的值。
如果您修复了这个bug,然后从与这些变量相关的代码的其他部分得到编译错误,那么您可能需要尝试一个不同的解决方案(这将涉及更多的代码编辑)。
添加在link.cpp中[请参阅上面的desine链接以获取完整代码]
1 2 | double METRIC_MIN = 1.0/DBL_MAX; double METRIC_MAX = DBL_MAX; |
如@imbibis建议