首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译错误:'stoi‘不是'std’的成员

编译错误:'stoi‘不是'std’的成员
EN

Stack Overflow用户
提问于 2016-06-26 00:34:10
回答 4查看 53.3K关注 0票数 22

我的代码:

代码语言:javascript
复制
#include <iostream>
#include <string>

int main()
{
    std::string test = "45";
    int myint = std::stoi(test);
    std::cout << myint << '\n';
}

给出编译错误:

代码语言:javascript
复制
error: 'stoi' is not a member of 'std'
     int myint = std::stoi(test);
                 ^

但是,根据这里的说法,这段代码应该编译得很好。我在CMakeLists.txt文件中使用行CMakeLists.txt

为何不编撰呢?

更新:我正在使用gcc,并运行gcc --version输出:

代码语言:javascript
复制
gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
EN

回答 4

Stack Overflow用户

发布于 2016-06-26 01:13:48

在libstdc++中,stoistol等的定义以及to_string函数都由条件保护。

代码语言:javascript
复制
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

我以前在一个平台(即安卓上的Termux )上遇到过这种失败,导致to_string甚至在g++ 6.1和C++14标准中都不可用。在这种情况下,我刚刚做了

代码语言:javascript
复制
#define _GLIBCXX_USE_C99 1

在包括任何东西之前,突然之间,功能就存在了。(您应该将它放在命令行中,而不是在包含<string>之前,因为另一个头可能首先包含<string>,然后它的包含保护将阻止它看到您的宏。)

我没有调查为什么这个宏一开始就没有被设置。显然,如果您希望您的代码实际工作(在我的例子中,我不是特别的,但是FWIW没有问题),这是一个值得关注的问题。

您应该检查_GLIBCXX_USE_C99是否未定义,或者是否定义了_GLIBCXX_HAVE_BROKEN_VSWPRINTF (在MinGW上可能是这样吗?)

票数 18
EN

Stack Overflow用户

发布于 2016-06-26 02:01:02

斯泰是一种C++11函数。您必须使用-std=c++11在g++和clang++中启用它。这是实际问题,而不是链接错误或特定的预处理器定义。

代码语言:javascript
复制
 $ cat test.cxx
#include <iostream>
#include <string>

int main()
{
    std::string test = "45";
    int myint = std::stoi(test);
    std::cout << myint << '\n';
}
 $ g++ -otest test.cxx
test.cxx: In Funktion »int main()«:
test.cxx:7:17: Fehler: »stoi« ist kein Element von »std«
     int myint = std::stoi(test);
                 ^
 $ g++ -otest test.cxx -std=c++11
 $ ./test
45
 $

编辑:我刚刚看到你使用了c++11。你确定这是你的编译选项吗?检查生成的makefile并观察执行的命令是否确定。

票数 9
EN

Stack Overflow用户

发布于 2016-06-26 00:58:03

你的版本似乎是最新的,所以不应该有问题。我认为这可能与gcc有关。尝试g++。(很可能是自动链接问题。如果您只是在C++文件上运行gcc,它就不会像g++那样“正常工作”。这是因为它不会自动链接到C++ std库等等)。我的第二个建议是试试std::atoi

@我已经解决了这个问题。std::stoi使用libstdc++。它是关于的GNU标准C++库。在gcc中,您必须链接添加-lstdc++。然而,在g++中,libstdc++是自动链接的。gcc使用g++

注意它是如何编译的

使用g++:g++ -std=c++11 -O3 -Wall -pedantic main.cpp && ./a.out

使用gcc:gcc -std=c++11 -O3 -Wall -pedantic -lstdc++ main.cpp && ./a.out

我认为你应该设置像set(CMAKE_EXE_LINKER_FLAGS "-libgcc -lstdc++")这样的标志(没有测试)

代码语言:javascript
复制
#include <cstdlib>

int myInt = std::atoi(test.c_str());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38034197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档