std::stoi 无法被 eclipse 识别
std::stoi not recognized by eclipse
在我的系统上,运行 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?
这需要相当多的挖掘,但显然,声明 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++ 常规 -> 路径和符号 -> 符号选项卡。
从左侧的选项列表中单击 GNU C++,然后单击 添加,并简单地输入所需的名称。
单击确定并关闭属性 window,在添加所需的定义后,通过导航到 *Project -> C/C++ Index -> [=39 重建索引器=]重建.
P.S。当你这样做时,你可能还想定义以下符号:
__cplusplus
值为 201103L
.
(这将有助于设置各种其他选项,例如 std::unordered_set)。
它隐藏在 <basic_string.h>
后面 - 只是您的 env 没有配置为暴露那段代码。
当您有一个 Makefile 项目时,Eclipse 索引器有时需要帮助了解环境才能匹配您的 Makefile。因此,即使 eclipse 会显示错误,也可以使用 make 成功构建项目。
对于这个特定问题,您基本上希望将 __cplusplus
宏设置为 >= 201103L。将 -std=c++11
添加到您的 makefile 中可以为您的 make 环境执行此操作,但我们也必须帮助 Eclipse。
对我来说,Eclipse 仍然将它设置为 199711L,即使在遵循 hyit 的指示之后也是如此。
修复:
项目 -> 属性 -> C/C++ 常规 -> 预处理器包括路径、宏等 -> CDT GCC 内置编译器设置 [共享] -> 添加 -std=c ++11 在 ${COMMAND}
之后
重建项目的索引,然后就可以了。它应该工作。
在我的系统上,运行 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?
这需要相当多的挖掘,但显然,声明 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++ 常规 -> 路径和符号 -> 符号选项卡。
从左侧的选项列表中单击 GNU C++,然后单击 添加,并简单地输入所需的名称。
单击确定并关闭属性 window,在添加所需的定义后,通过导航到 *Project -> C/C++ Index -> [=39 重建索引器=]重建.
P.S。当你这样做时,你可能还想定义以下符号:
__cplusplus
值为 201103L
.
(这将有助于设置各种其他选项,例如 std::unordered_set)。
它隐藏在 <basic_string.h>
后面 - 只是您的 env 没有配置为暴露那段代码。
当您有一个 Makefile 项目时,Eclipse 索引器有时需要帮助了解环境才能匹配您的 Makefile。因此,即使 eclipse 会显示错误,也可以使用 make 成功构建项目。
对于这个特定问题,您基本上希望将 __cplusplus
宏设置为 >= 201103L。将 -std=c++11
添加到您的 makefile 中可以为您的 make 环境执行此操作,但我们也必须帮助 Eclipse。
对我来说,Eclipse 仍然将它设置为 199711L,即使在遵循 hyit 的指示之后也是如此。
修复:
项目 -> 属性 -> C/C++ 常规 -> 预处理器包括路径、宏等 -> CDT GCC 内置编译器设置 [共享] -> 添加 -std=c ++11 在 ${COMMAND}
之后重建项目的索引,然后就可以了。它应该工作。