代码之家  ›  专栏  ›  技术社区  ›  hyit

eclipse无法识别std::stoi

  •  2
  • hyit  · 技术社区  · 10 年前

    在我的系统上,运行Windows 7 x64、Eclipse Luna和g++4.9.2(通过cygwin安装),g++似乎从未声明std::stoi。 根据文档,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?

    2 回复  |  直到 10 年前
        1
  •  2
  •   hyit    10 年前

    这花了相当多的时间,但显然,声明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+Space)是否提示它们。如果是的话,它们就被定义了。如果不是,继续阅读。

    决定性的 也很容易!导航到: 项目->属性->C/C++常规->路径和符号->“符号”选项卡 .

    点击 天鹅座C++ 从左侧的选项列表中,然后单击 添加 ,只需给出所需的名称。

    添加所需的定义后,单击“确定”并关闭属性窗口,然后通过导航到*Project->C/C++索引-> 重建 .

    P.S.当您在使用时,您可能还需要定义以下符号: __cplusplus 具有值 201103L .

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

        2
  •  0
  •   CompEng88    8 年前

    它藏在后面 <basic_string.h> -只是您的env没有配置为公开这段代码。

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

    对于这个特定的问题,您基本上希望 __cplusplus 要设置为某个对象的宏>=2011年03月。添加 -std=c++11 到您的makefile可以为您的make环境实现这一点,但我们也必须帮助Eclipse。

    对我来说,Eclipse仍然将其设置为199711L,即使遵循了hyit的指示。

    要修复:

    项目->属性->C/C++常规->预处理器包括路径、宏等->CDT GCC内置编译器设置[Shared]->在${COMMAND}之后添加-std=c++11

    重建项目的索引,就这样了。它应该会起作用。