0

I am trying to take a string and parse it into an int. I have read the many answers out there, and it seems that using stoi is the most up-to-date way. It appears to me that stoi uses std, but I am getting Function 'stoi' could not be resolved despitre using namespace std;

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include<stdlib.h>

using namespace std;

int main(int argc, char* argv[]) {

    string line = "";
    string five = "5";
    int number = stoi(five); //Error here with stoi
    return 0;
}

Any ideas what is causing this?

Update:

I am using Eclipse. My flags are: -c -fmessage-length=0 -std=c++11

Evorlor
  • 7,263
  • 17
  • 70
  • 141

3 Answers3

2

If you are using GCC or MINGW, then this is the answer: std::stoi doesn't exist in g++ 4.6.1 on MinGW

This is a result of a non-standard declaration of vswprintf on Windows. The GNU Standard Library defines _GLIBCXX_HAVE_BROKEN_VSWPRINTF on this platform, which in turn disables the conversion functions you're attempting to use. You can read more about this issue and macro here: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522.

If you're willing to modify the header files distributed with MinGW, you may be able to work around this by removing the !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) macro on line 2754 of .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h, and adding it back around lines 2905 to 2965 (the lines that reference std::vswprintf). You won't be able to use the std::to_wstring functions, but many of the other conversion functions should be available.

Please always provide platform and compiler information.

Community
  • 1
  • 1
Markus
  • 592
  • 3
  • 13
0

Toggle on C++11 support in your compiler flags. -std=c++11 for a recent gcc. For Eclipse, please refer to the corresponding question in the FAQ and this answer explains how to get rid of the remaining Eclipse warning.

Community
  • 1
  • 1
user3146587
  • 4,250
  • 1
  • 16
  • 25
0

If you are amenable to parsing an int another way, how about using an STL algorithm and a C++11 lambda expression?

#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

int main() {
    string str = "12345";

    int num = 0;

    for_each(str.begin(), str.end(), [&num](char c){ num = 10 * num + (c - '0');  });

    cout << str << " = " << num << endl;
}
  • Good catch! I think the { int number; istringstream iss("5"); iss >> number; } approach suggested by Brandin is more general and suitable. – user3236204 Jan 26 '14 at 12:41