【问题标题】:std::stoi not recognized by eclipse日食无法识别 std::stoi
【发布时间】:2015-11-25 08:39:52
【问题描述】:

在我的系统上,运行 Windows 7 x64、Eclipse Luna 和 g++ 4.9.2(通过 cygwin 安装),似乎 std::stoi 从未由 g++ 声明。 根据文档,stoi 是字符串库的一部分,所以显然我有#include <string>

此外,我知道 stoi 是在 C++11 中引入的,并且我已经为我的编译器 (g++) 设置了适当的标志,即使这看起来像 IDE 错误,而不是编译器错误。

不过,在构建我的项目时,我会收到以下错误消息之一:

error: 'stoi' is not a member of 'std'
error: Function 'stoi' could not be resolved

我该如何解决这个问题?如何让 Eclipse 识别 stoi?

【问题讨论】:

    标签: c++ eclipse c++11 g++ c++-standard-library


    【解决方案1】:

    它隐藏在<basic_string.h> 后面——只是你的环境没有配置为公开那段代码。

    当您有一个 Makefile 项目时,Eclipse 索引器有时需要帮助了解环境才能匹配您的 Makefile。因此,即使 eclipse 会显示错误,也可以使用 make 成功构建您的项目。

    对于这个特定问题,您基本上希望将您的 __cplusplus 宏设置为 >= 201103L。将 -std=c++11 添加到您的 makefile 中可以为您的 make 环境执行此操作,但我们也必须帮助 Eclipse。

    对我来说,Eclipse 仍然将其设置为 199711L,即使按照 hyit 的指示进行操作。

    修复:

    Project -> Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc -> CDT GCC Built-in Compiler Settings [ Shared ] -> Add -std=c++11 after ${COMMAND}

    重建项目的索引,然后就可以了。它应该工作。

    【讨论】:

      【解决方案2】:

      这需要大量的挖掘,但显然,声明 stoi 的代码位于 <basic_string.h> 内部,看起来像这样:

      #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
       && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
      #include <ext/string_conversions.h>
      namespace std _GLIBCXX_VISIBILITY(default)
      {
      _GLIBCXX_BEGIN_NAMESPACE_VERSION
        // 21.4 Numeric Conversions [string.conversions].
        inline int
        stoi(const string& __str, size_t* __idx = 0, int __base = 10)
        { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
                      __idx, __base); }
      

      因此,很容易看出,为了使std::stoi 可用,必须确保以下几点:

      • __GXX_EXPERIMENTAL_CXX_0X__ 已定义。
      • _GLIBCXX_USE_C99 已定义。
      • _GLIBCXX_HAVE_BROKEN_VSWPRINTF定义。

      现在,在 Eclipse 中,如果您打开了自动完成功能,那么检查这些并进行设置非常容易!

      检查:只需在代码中的任意位置、新行开始输入它们,然后查看自动完成(通常是 CTRL+空格)是否提示它们。如果是这样-它们已定义。如果不是,请继续阅读。

      定义也很简单!导航到:项目 -> 属性 -> C/C++ 常规 -> 路径和符号 -> 符号选项卡

      点击左侧选项列表中的GNU C++,然后点击添加,只需输入所需的名称即可。

      在添加所需的定义后,单击确定并关闭属性窗口,然后导航至 *Project -> C/C++ Index -> 重建 重建索引器强>。

      附:当您使用它时,您可能还想定义以下符号: __cplusplus 的值为 201103L

      (这将有助于设置各种其他选项,例如 std::unordered_set)。

      【讨论】:

      • 定义是指将值设置为“true”还是什么?
      • @magulla by defined 我的意思是它应该只出现在符号选项卡中。它不需要有值——它类似于 C 中的 headguards 约定——它们没有值,它们只是被声明了。
      • 谢谢,我实际上已经找到了它们的定义位置。它们确实有价值。 env 变量(符号)不能用 out 值定义。
      • __cplusplus 对我来说设置为 199711L。你的指示不起作用。它仍然坚持使用旧的 __cplusplus 版本。
      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多