编译错误:' stoi'不是' std'的成员

时间:2016-06-26 00:34:11

标签: c++

我的代码:

unique_ptr

给我编译错误:

constexpr unique_ptr();
constexpr unique_ptr( nullptr_t );
explicit unique_ptr( pointer p );
unique_ptr( pointer p, /* see below */ d1 );
unique_ptr( pointer p, /* see below */ d2 );
unique_ptr( unique_ptr&& u );

template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u );

但是,根据here,此代码应该可以正常编译。我在#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

4 个答案:

答案 0 :(得分:14)

在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可能是这种情况?)

答案 1 :(得分:7)

std :: stoi是C++11 function。您必须使用-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并观察执行的命令是否确定。

答案 2 :(得分:3)

您的版本似乎是最新的,所以不应该是一个问题。我认为这可能与gcc有关。请尝试使用g++。(最有可能自动链接问题。如果您只是在C ++文件上运行gcc,它就不会像G ++那样工作。那是因为它不会自动链接到C ++ std库等)。我的第二个建议是尝试std::atoi

@我已经解决了这个问题。 std::stoi使用 libstdc ++ 。它是关于 GNU标准C ++库。在gcc中,您必须关联添加-lstdc++。但是,在g ++中, libstdc ++ 会自动链接。 using gccusing 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 :(得分:0)

如果您使用 Cmake 进行编译,请添加以下行:

“ add_definitions(-std = c ++ 11)”

在find_package命令之后。