“numeric_limits”不是“std”的成员

‘numeric_limits’ is not a member of ‘std’

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

我正在按照说明进行操作,但是当我 运行 cmake --build ./build 时,出现以下错误:

In file included from /home/jon/src/FlyWithLua/src/FloatingWindows

/FLWIntegration.cpp:10:
/home/jon/src/FlyWithLua/src/third_party/sol2/./upstream/sol.hpp: In lambda function:
/home/jon/src/FlyWithLua/src/third_party/sol2/./upstream/sol.hpp:7194:59: 
      error: ‘numeric_limits’ is not a member of ‘std’
7194 |               std::size_t space = (std::numeric_limits<std::size_t>::max)();

此后同一行还有其他几个错误,但我想如果我能解决这个错误,它们可能就会消失。

有几个 similar issues 解决方案可以将以下内容添加到 .hpp 文件中

#include <stdexcept>
#include <limits>

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

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

https://sol2.readthedocs.io/en/latest/errors.html 给出了一些关于编译器可能无法识别的原因的提示,包括:

Compiler Errors / Warnings

A myriad of compiler errors can occur when something goes wrong. Here is some basic advice about working with these types:

If there are a myriad of errors relating to std::index_sequence, type traits, 
and other std:: members, it is likely you have not turned on your C++14 switch for
your compiler. Visual Studio 2015 turns these on by default, but g++ and clang++ 
do not have them as defaults and you should pass the flag --std=c++1y or
--std=c++14, or similar for your compiler.

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
/home/jon/src/FlyWithLua/src/third_party/sol2/./upstream/sol.hpp:7194:59:

      error: ‘numeric_limits’ is not a member of ‘std’
7194 |               std::size_t space = (std::numeric_limits<std::size_t>::max)();

此错误消息暗示 src/third_party/sol2/./upstream/sol.hpp header 使用 std::numeric_limits,但还表示 std::numeric_limits 尚未定义。最简单的解释是没有包含定义 std::numeric_limits 的 header。在这种情况下,解决方案是包括定义 std::numeric_limits.

的 header

the sol.hpp file includes the following imports:

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

这证实了问题。这些 header 都没有定义 std::numeric_limits.

https://sol2.readthedocs.io/en/latest/errors.html gives some hints about the why the compiler might not recognize these includes:

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


结论:根据引用的错误消息,sol.hpp 使用 header <limits> 中定义的 std::numeric_limits,但根据您的说法,它没有包括 header。如果是这种情况,那么这是 sol.hpp 文件中的错误。正确的解决方案是在使用 std::numeric_limits.

之前通过在该文件中包含 <limits> 来修复 sol.hpp 文件