Ошибка компиляции: «Stoi» не является членом «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);
^

Однако согласно Вот, этот код должен хорошо скомпилироваться. Я использую линию set(CMAKE_CXX_FLAGS "-std=c++11 -O3") в моем CMakeLists.txt файл.

Почему он не компилируется?


Обновление: я использую gccи работает gcc --version распечатывает:

gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010

10

Решение

В libstdc ++ определения stoi, stolи т. д., а также to_string функции, охраняются условием

#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

Я имел этот сбой на одной платформе раньше (а именно Termux на Android), в результате чего to_string недоступно даже с g ++ 6.1 и стандартом C ++ 14. В этом случае я просто сделал

#define _GLIBCXX_USE_C99 1

прежде чем включать что-нибудь, и вуаля, вдруг функции существовали. (Вы должны поставить это сначала, или даже в командной строке, а не только перед включением <string>потому что другой заголовок может включать <string> сначала, а затем включенные охранники не дадут ему увидеть ваш макрос.)

Я не исследовал, почему этот макрос не был установлен в первую очередь. Очевидно, это повод для беспокойства, если вы хотите, чтобы ваш код действительно работал (в моем случае я не особенно, но FWIW проблем не было).

Вы должны проверить, если _GLIBCXX_USE_C99 не определено, или если _GLIBCXX_HAVE_BROKEN_VSWPRINTF является определены (что может быть в случае с MinGW?)

13

Другие решения

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
$

редактировать: я только что увидел, что вы использовали с ++ 11. Вы уверены, что это входит в ваши параметры компиляции? Проверьте сгенерированный make-файл и проследите за выполнением команд, чтобы быть уверенными.

6

Ваша версия выглядит актуальной, поэтому проблем быть не должно. Я думаю, что это может быть связано с gcc, Пытаться g++ вместо.(Скорее всего, автоматически связать проблему. Если вы просто запустите gcc для файла C ++, он не будет «просто работать», как это делает 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++") (Не испытано)

#include <cstdlib>

int myInt = std::atoi(test.c_str());
3
По вопросам рекламы [email protected]