Мой код:
#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
В 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?)
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-файл и проследите за выполнением команд, чтобы быть уверенными.
Ваша версия выглядит актуальной, поэтому проблем быть не должно. Я думаю, что это может быть связано с 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());