这需要大量的挖掘,但显然,声明 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)。