编译错误:"stoi"不是"std"的成员

Compile error: 'stoi' is not a member of 'std'

本文关键字:std 成员 不是 stoi 错误 编译      更新时间:2023-10-16

我的代码:

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

给我编译错误:

error: 'stoi' is not a member of 'std'
     int myint = std::stoi(test);
                 ^

然而,根据这里,这段代码应该可以很好地编译。我正在使用CMakeLists.txt文件中的set(CMAKE_CXX_FLAGS "-std=c++11 -O3")行。

为什么不编译?


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

gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010

在libstdc++中,stoi, stol等函数的定义,以及to_string函数,都是由条件

保护的。
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) 
     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

我以前在一个平台上遇到过这种失败(即Android上的Termux),导致to_string即使在g++ 6.1和c++ 14标准下也不可用。在这种情况下,我只做了

#define _GLIBCXX_USE_C99 1

在包含任何内容之前,然后,突然,函数就存在了。(您应该把它放在前面,或者甚至放在命令行上,而不是仅仅放在包含<string>之前,因为另一个头可能首先包含<string>,然后它的包含保护将使它永远看不到您的宏。)

我没有调查为什么不首先设置这个宏。显然,如果你想让你的代码实际工作,这是一个值得关注的问题(在我的情况下,我没有特别的,但fww没有问题。)

您应该检查_GLIBCXX_USE_C99是否未定义,或者_GLIBCXX_HAVE_BROKEN_VSWPRINTF 是否已定义(这可能是MinGW上的情况)

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

 $ 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并观察执行的命令。

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

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

注意如何编译

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

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

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

#include <cstdlib>
int myInt = std::atoi(test.c_str());

如果您正在使用Cmake进行编译,请添加一行:

" add_definitions(化= c + + 11)"

使用的设置(CMAKE_CXX_STANDARD 11) Cmake