‘numeric_limits’ 不是 ‘std’ 的成员

我试图从源代码编译 FlyWithLua 应用程序,其中包括 sol2 库。

我按照说明进行操作,但当我运行 cmake --build ./build 时,我遇到以下错误:

在文件 /home/jon/src/FlyWithLua/src/FloatingWindows

/FLWIntegration.cpp:10 中包含;
/home/jon/src/FlyWithLua/src/third_party/sol2/./upstream/sol.hpp:在 lambda 函数中:
/home/jon/src/FlyWithLua/src/third_party/sol2/./upstream/sol.hpp:7194:59:
      error: ‘numeric_limits’ 不是 ‘std’ 的成员
7194 |               std::size_t space = (std::numeric_limits<std::size_t>::max)();

在此之后同一行上有几个其他错误,但我想解决这个错误,其余错误可能会消失。

有几个 类似的问题,解决方法是将以下包括添加到 .hpp 文件中

#include <stdexcept>
#include <limits>

sol.hpp 文件包括以下导入项:

#include <stddef.h>
#include <limits.h>

https://sol2.readthedocs.io/en/latest/errors.html 提供了有关为什么编译器可能无法识别这些包括的一些提示:

编译器错误/警告

当出现问题时可能会出现许多编译器错误。下面是一些有关处理这些类型的基本建议:


如果出现了许多与 std::index_sequence、类型 traits 等 std:: 成员有关的错误,很可能是您没有为编译器打开 C++14 开关。Visual Studio 2015 默认打开这些开关,但 g++ 和 clang++ 没有默认值,您应该为编译器传递 -std=c++1y 或

-std=c++14(或类似的),以便打开这些开关。

src/CMakeList.txt 文件具有以下行:

set(CMAKE_CXX_STANDARD 17)

我对 C/C++ 只是略有了解,这对我来说似乎非常复杂,但我希望对于更有技能的人来说,可能会有易于识别原因的解决方案。

cat /etc/*-release 输出如下:

DISTRIB_RELEASE=21.10
DISTRIB_CODENAME=impish
DISTRIB_DESCRIPTION="Ubuntu 21.10"

$ g++ --version
g++ (Ubuntu 11.2.0-7ubuntu2) 11.2.0

原文链接 https://stackoverflow.com/questions/71296302

点赞
stackoverflow用户2079303
stackoverflow用户2079303

这个错误信息表明 src/third_party/sol2/./upstream/sol.hpp 头文件使用了 std::numeric_limits,但也意味着 std::numeric_limits 没有被定义。最简单的解释是定义 std::numeric_limits 的头文件没有被引入。在这种情况下,解决方法就是在使用 std::numeric_limits 前,将定义 std::numeric_limits的头文件包含进来。

sol.hpp 文件包含以下的导入语句:

#include <stddef.h> 
#include <limits.h>

这证实了问题所在。这两个头文件都没有定义 std::numeric_limits

https://sol2.readthedocs.io/en/latest/errors.html 提供了一些关于为何编译器不能识别这些引入文件的提示:

这些提示可能适用于其他情况,但不适用于这一情况。std::numeric_limits 从一开始就是 C++ 标准的一部分,所以语言版本对其存在性没有影响。

综上:根据引用的错误信息,sol.hpp文件使用了std::numeric_limits,而这个函数在头文件<limits>中定义。但据你所说,在使用std::numeric_limits 之前没有将这个头文件引入。如果情况就是这样,那么sol.hpp文件就有问题。正确的解决方案是在使用 std::numeric_limits 之前,先在sol.hpp文件中包含 <limits> 头文件。

2022-02-28 15:04:35