编译错误:"stoi"不是"std"的成员
Compile error: 'stoi' is not a member of 'std'
我的代码:
#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
- std::ofstream 作为类成员删除复制构造函数?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- std::to_string - 'to_string' 不是 'std' 的成员 - Visual Studio Code 1.42.0
- 使用 std::async 时死锁,将来作为成员
- 可变参数模板参数扩展 类型为 std::function 的类成员
- FreeFileSync C++错误:'byte'不是 'std' 的成员
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- std::异步与非静态成员函数
- 如何在 c++11 中静态断言 std::array 类成员进行排序?
- 将初始化器列表/聚合初始化转发到 std::array 成员
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 在哪里可以找到 std::bitset 的数据成员?
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- unique_ptr问题:不是'std'成员
- std::成员函数的异步调用