簡體   English   中英

編譯錯誤:'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 ++中, stoistol等的定義以及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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM