在我的系统上,运行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?
答案 0 :(得分: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
NOT 已定义。现在,在Eclipse中,如果你打开了自动完成功能,检查这些并设置它们就很容易了!
检查:只需在代码中的任意位置开始输入新行,然后查看是否自动完成(通常是CTRL + Space)。如果确实如此 - 它们已被定义。如果他们不是,继续阅读。
定义也很简单!导航至:项目 - &gt;属性 - &gt; C / C ++一般 - &gt;路径和符号 - &gt;符号选项卡。
点击左侧选项列表中的 GNU C ++ ,然后点击添加,只需输入所需的名称。
单击“确定”并在添加所需定义后关闭属性窗口,并通过导航到* Project - &gt;重建索引器。 C / C ++索引 - &gt;的 重建 强>
P.S。当你在它时,你可能还想定义以下符号:
值__cplusplus
的{{1}}。
(这将有助于设置各种其他选项,例如std :: unordered_set)。
答案 1 :(得分:0)
它隐藏在<basic_string.h>
后面-只是您的环境未配置为公开那段代码。
当您拥有一个Makefile项目时,Eclipse索引器有时需要帮助您了解环境以匹配您的Makefile。因此,即使eclipse会显示错误,也可以使用make成功构建项目。
对于此特定问题,您基本上希望将__cplusplus
宏设置为> = 201103L。将-std=c++11
添加到您的makefile中可为您的make环境做到这一点,但是我们也必须帮助Eclipse。
对我来说,即使遵循hyit的指示,Eclipse仍将其设置为199711L。
要修复:
项目->属性-> C / C ++常规->预处理器包括路径,宏等-> CDT GCC内置编译器设置[共享]->在$ {COMMAND}之后添加-std = c ++ 11 >
重建项目的索引,然后开始。它应该工作。