I’m learning C++. I regularly get errors that look like this
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/basic_string.h:1458: instantiated from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, std::__false_type) [with _InIterator = std::istream_iterator, std::allocator >, char, std::char_traits, int>, _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]’
How do I make sense of this so that I can at least have some place to search for a solution?
In case you’re interested, the original code is:
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
using namespace std;
int main(int argc, char **argv) {
string fileName = "example.txt";
ifstream ifile(fileName.c_str());
istream_iterator<string> begin(ifile);
istream_iterator<string> end;
string s(begin,end);
cout << s;
}
This is not the whole error, just a description of one instantiation.
Basically you care about:
1) which line in your code triggered the error (
string s(begin,end);)2) what error did it result in (e.g
cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment) and where3) you might compare what the compiler is saying the template parameters are, and what you assume them to be.
It probably takes some experience not to be scared of the errors, and it certainly helps to know the library well.
In this case the cause is that the string’s constructor is expecting a range of characters, but you are passing a range of strings.