关于c ++:对构造函数的调用不能出现在常量表达式中

a call to a constructor cannot appear in a constant-expression

当我运行make build进行项目设计时,我得到了错误: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;
                                      ^

如果我将Network\Link.hLink类定义侧的代码从

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文件中(只要该文件包含Link.h就不重要了)在文件范围中添加以下行:

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建议