[英]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>
,然后它的包含防護將使它不會看到你的宏。)
我沒有調查為什么這個宏沒有設置在第一位。 顯然,如果你想讓你的代碼實際工作,這是一個令人擔憂的問題(在我的情況下,我沒有特別的,但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
$
編輯:我剛看到你使用的是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: gcc -std=c++11 -O3 -Wall -pedantic -lstdc++ main.cpp && ./a.out
我認為你應該像set(CMAKE_EXE_LINKER_FLAGS "-libgcc -lstdc++")
一樣設置標志set(CMAKE_EXE_LINKER_FLAGS "-libgcc -lstdc++")
(未測試)
#include <cstdlib>
int myInt = std::atoi(test.c_str());
如果您使用Cmake進行編譯,請添加以下行:
“add_definitions(-std = C ++ 11)”
在find_package命令之后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.