我的代码:
#include <iostream>
#include <string>
int main()
{
std::string test = "45";
int myint = std::stoi(test);
std::cout << myint << '\n';
}
Run Code Online (Sandbox Code Playgroud)
给我编译错误:
error: 'stoi' is not a member of 'std'
int myint = std::stoi(test);
^
Run Code Online (Sandbox Code Playgroud)
但是,根据这里,这段代码应该编译好.我set(CMAKE_CXX_FLAGS "-std=c++11 -O3")在我的CMakeLists.txt文件中使用该行.
为什么不编译?
更新:我正在使用gcc,并运行gcc --version打印输出:
gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
Run Code Online (Sandbox Code Playgroud)
Nic*_*teo 15
在libstdc ++中stoi,条件stol等对to_string函数的定义以及函数进行了保护
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
Run Code Online (Sandbox Code Playgroud)
我之前在一个平台上遇到过这种故障(即Android上的Termux),to_string即使使用g ++ 6.1和C++ 14标准也无法使用.在那种情况下,我就是这么做的
#define _GLIBCXX_USE_C99 1
Run Code Online (Sandbox Code Playgroud)
在包括任何东西之前,我们突然发现了这些功能.(你应该把它放在第一个,甚至放在命令行上,而不是在包括之前<string>,因为另一个标题可能<string>首先包含,然后它的包含警卫将使它不会看到你的宏.)
我没有调查为什么这个宏没有设置在第一位.显然,如果你想让你的代码实际工作,这是一个令人担忧的问题(在我的情况下,我没有特别的,但FWIW没有问题.)
您应该检查是否_GLIBCXX_USE_C99未定义,或者是否_GLIBCXX_HAVE_BROKEN_VSWPRINTF 已定义(MinGW可能是这种情况?)
std :: stoi是一个C++ 11函数.您必须使用-std=c++11它在g ++和clang ++中启用它.这是实际问题,而不是链接错误或特定预处理器定义.
$ 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
$
Run Code Online (Sandbox Code Playgroud)
编辑:我刚看到你使用的是c ++ 11.你确定它正在进入你的编译选项吗?检查生成的makefile并观察执行的命令是否确定.
您的版本似乎是最新的,因此应该没有问题。我认为可能与有关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 -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());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35855 次 |
| 最近记录: |