在OSX上的C ++ 17中使constexpr与pow一起使用

亚历克斯

我正在尝试获取一个用C ++ 17编写的可在OSX(Mojave)上运行的基于Linux的项目。大部分内容都可以编译,直到获得该文件为止ClassName.hpp::

class ClassName {

public:

    static constexpr double DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1 = 2; // represents 0.99
    static constexpr double DEFAULT_TARGET_TFINAL_DIGITS_FROM_0 = 10; // represents 1e-10
    static constexpr double DEFAULT_TARGET_INITIAL_PBAD = (1-pow(10,-DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1));
    static constexpr double DEFAULT_TARGET_FINAL_PBAD = pow(10,-DEFAULT_TARGET_TFINAL_DIGITS_FROM_0);
    static constexpr double DEFAULT_ERROR_TOL_DIGITS = 0.9; // as a fraction of digits in the last place from the above.
    static constexpr double DEFAULT_SAMPLE_TIME = 1;

    // more unrelated code
};

编译时,出现以下错误:

error: constexpr variable
     'DEFAULT_TARGET_INITIAL_PBAD' must be initialized by a constant expression
 ...double DEFAULT_TARGET_INITIAL_PBAD = (1-pow(10,-DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1));
           ^                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClassName.hpp: note: non-constexpr function 'pow<int, double>'
     cannot be used in a constant expression
   static constexpr double DEFAULT_TARGET_INITIAL_PBAD = (1-pow(10,-DEFAULT_TARGET_TINITI...
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h:968:1: note:
     declared here
pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT

因此出于某种原因,它可以在Ubuntu和CentOS上运行。我认为这与如何pow定义有关?但是我不确定如何解决它,或者甚至是问题所在。我也试着删除constexprDEFAULT_TARGET_TINITIAL_DIGITS_FROM_1DEFAULT_TARGET_TFINAL_DIGITS_FROM_0,使它们const,但仍然会碰到同样的问题。

道格

首先,你不能初始化constexpr类成员不是函数constexprstd::powconstepxr标准的C ++ 17。解决方法是声明它们const尽管不能在需要编译时间的地方使用const它们,但它们是不可变的。传统方法是在标头中声明它们,并根据需要将其包括在源文件中。然后,您需要一个定义静态const成员的实现文件。

如果您的代码需要编译时间const或constexpr,则唯一的选择是编写自己的代码pow

这是一种constexpr使用表示技术的问题的一部分,使用不在执行main()之前的函数来初始化const statics的一种方法

创建一个标头constinit.h,该标头声明该类

// include header guards
// declare the static consts
struct ClassName {
    static double DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1; // represents 0.99
    static double DEFAULT_TARGET_INITIAL_PBAD; // to be initialized by pow
};

创建一个初始化静态文件的实现文件:

#include "constinit.h"
#include <cmath>

double ClassName::DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1{ 2 }; // represents 0.99
double ClassName::DEFAULT_TARGET_INITIAL_PBAD = (1 - std::pow(10, -DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1));

要使用静态变量:

#include <iostream>
#include "constinit.h"


int main()
{
    std::cout << ClassName::DEFAULT_TARGET_INITIAL_PBAD << std::endl;
}

如果constexpr需要编译时初始化,则需要定义自己的constexprpow函数。这适用于C ++ 17:

    #pragma once // or header guards per your preference

constexpr double my_pow(double x, int exp)
{
    int sign = 1;
    if (exp < 0)
    {
        sign = -1;
        exp = -exp;
    }
    if (exp == 0)
        return x < 0 ? -1.0 : 1.0;
    double ret = x;
    while (--exp)
        ret *= x;
    return sign > 0 ? ret : 1.0/ret;
}
class ClassName {
public:
    static constexpr double DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1 = 2; // represents 0.99
    static constexpr double DEFAULT_TARGET_TFINAL_DIGITS_FROM_0 = 10; // represents 1e-10
    static constexpr double DEFAULT_TARGET_INITIAL_PBAD = (1 - my_pow(10, -DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1));
    static constexpr double DEFAULT_TARGET_FINAL_PBAD = my_pow(10, -DEFAULT_TARGET_TFINAL_DIGITS_FROM_0);
    static constexpr double DEFAULT_ERROR_TOL_DIGITS = 0.9; // as a fraction of digits in the last place from the above.
    static constexpr double DEFAULT_SAMPLE_TIME = 1;

    // more unrelated code
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在OSX上使用VisualStudioCode编译C ++

来自分类Dev

如何在c ++ 17中传递要与std :: invoke一起使用的Callable对象

来自分类Dev

在C中与atoi()一起使用

来自分类Dev

Mac OSX上的VM中的Oracle Database 12c

来自分类Dev

用于在osx上的C中解压缩存档的库

来自分类Dev

如何在UNIX(OSX)上的C ++中建立目录?

来自分类Dev

OSX上Qt5 / QtCreator 3.0.1中的C ++ 11

来自分类Dev

如何在OSX上安装gtk以与g ++ / gcc编译器一起使用

来自分类Dev

无法在OSX上使Xamarin项目与Rider-EAP一起使用

来自分类Dev

如何在OSX上安装gtk以与g ++ / gcc编译器一起使用

来自分类Dev

xcode实时视图的优胜美地(OSX 10.10)功能可与OSX上的NSView一起使用吗?

来自分类Dev

C ++ 17 resumable / await:它也可以与boost :: future一起使用吗?

来自分类Dev

在目标C中与__cplusplus一起使用@import

来自分类Dev

在Linq C#中与charindex一起使用left

来自分类Dev

在c ++中与fifo一起使用(阻止读取)

来自分类Dev

C中的分段错误,与char *函数一起使用

来自分类Dev

与C#中的dataTable一起使用

来自分类Dev

TFS与C#中的IBuildController一起使用

来自分类Dev

在c中,将if语句与结构项一起使用

来自分类Dev

如何在OSX上创建一个窗口以用于C ++?

来自分类Dev

在OSX + clang上的准系统SWIG python C接口segfaulting,不在Linux + gcc中

来自分类Dev

如何在OSX上的C ++应用程序中播放合成声音?

来自分类Dev

为什么在OSX上的c编程中Ctrl-J和Ctrl-M返回10?

来自分类Dev

在OSX上使用pip安装pyenchant时出现“找不到附魔C库”

来自分类Dev

使用unistd.h和C写入Mac OSX 10.9.3上的串行端口

来自分类Dev

在OSx上使用CMake构建C ++项目:ld:找不到架构x86_64的符号

来自分类Dev

GStreamer udpsrc可与gst-launch一起使用,但不能在应用程序(OSX)中使用

来自分类Dev

C ++ 17,为什么自动非类型模板参数不能与SFINAE一起使用

来自分类Dev

在MacOS的Geany中使SFML与C ++一起使用时遇到问题

Related 相关文章

  1. 1

    在OSX上使用VisualStudioCode编译C ++

  2. 2

    如何在c ++ 17中传递要与std :: invoke一起使用的Callable对象

  3. 3

    在C中与atoi()一起使用

  4. 4

    Mac OSX上的VM中的Oracle Database 12c

  5. 5

    用于在osx上的C中解压缩存档的库

  6. 6

    如何在UNIX(OSX)上的C ++中建立目录?

  7. 7

    OSX上Qt5 / QtCreator 3.0.1中的C ++ 11

  8. 8

    如何在OSX上安装gtk以与g ++ / gcc编译器一起使用

  9. 9

    无法在OSX上使Xamarin项目与Rider-EAP一起使用

  10. 10

    如何在OSX上安装gtk以与g ++ / gcc编译器一起使用

  11. 11

    xcode实时视图的优胜美地(OSX 10.10)功能可与OSX上的NSView一起使用吗?

  12. 12

    C ++ 17 resumable / await:它也可以与boost :: future一起使用吗?

  13. 13

    在目标C中与__cplusplus一起使用@import

  14. 14

    在Linq C#中与charindex一起使用left

  15. 15

    在c ++中与fifo一起使用(阻止读取)

  16. 16

    C中的分段错误,与char *函数一起使用

  17. 17

    与C#中的dataTable一起使用

  18. 18

    TFS与C#中的IBuildController一起使用

  19. 19

    在c中,将if语句与结构项一起使用

  20. 20

    如何在OSX上创建一个窗口以用于C ++?

  21. 21

    在OSX + clang上的准系统SWIG python C接口segfaulting,不在Linux + gcc中

  22. 22

    如何在OSX上的C ++应用程序中播放合成声音?

  23. 23

    为什么在OSX上的c编程中Ctrl-J和Ctrl-M返回10?

  24. 24

    在OSX上使用pip安装pyenchant时出现“找不到附魔C库”

  25. 25

    使用unistd.h和C写入Mac OSX 10.9.3上的串行端口

  26. 26

    在OSx上使用CMake构建C ++项目:ld:找不到架构x86_64的符号

  27. 27

    GStreamer udpsrc可与gst-launch一起使用,但不能在应用程序(OSX)中使用

  28. 28

    C ++ 17,为什么自动非类型模板参数不能与SFINAE一起使用

  29. 29

    在MacOS的Geany中使SFML与C ++一起使用时遇到问题

热门标签

归档