Konkretny komunikat pokażesz powinien być tylko częścią błędu wydanego przez g ++. Pełne błąd powinien wyglądać bliżej poniżej (mam skróceniu ścieżki, i wyjście to od 4.1.2):
basic_string.tcc: In static member function 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&, std::input_iterator_tag) [with _InIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]':
basic_string.h:1449: instantiated from 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, __false_type) [with _InIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'
basic_string.h:1464: instantiated from 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&) [with _InIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'
basic_string.tcc:241: instantiated from 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'
t.cpp:16: instantiated from here
Line 101: error: cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment
compilation terminated due to -Wfatal-errors.
To nie jest o wiele bardziej przyjazny, to jest? :-) Przydatne linie w błędzie to linie na końcu, a nie linie na początku.Komunikat o błędzie jest wydawane w odwrotnej kolejności: pierwszy błąd jest faktycznym błędem, następnie kolejne linie dostarczają ścieżek menu za pośrednictwem źródła pokazującego, w jaki sposób kompilator się tam dostał. Ostatnia linia pokazuje gdzie w źródle Wystąpił błąd:
t.cpp:16: instantiated from here
Line 101: error: cannot convert '
const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to
'char' in assignment
w moim przykładzie pliku t.cpp:16
jest następujący wiersz:
string s(begin,end);
Jeśli skomentuj tę linię (a linia po nim, że używa s
), przekonasz się, że twoje źródło kompiluje się bezbłędnie.
W tym miejscu powinno być całkiem jasne, że używasz konstruktora std::string
niepoprawnie, co oznacza, że przekazujesz mu niewłaściwe typy argumentów. Dajesz mu coś, co ma std::string
(to jest std::basic_string<char>
) i oczekuje czegoś, co ma char
.
Jeśli skonsultować się z dokumentacją std::string
, przekonasz się, że to ma konstruktora, który wygląda tak:
template <typename InputIterator>
string(InputIterator first, InputIterator last);
te iteratory wejściowe pozwalają tworzyć ciąg z zakresu znaków. Przekazujesz jednak zakres std::string
s do konstruktora. Jeśli zmienisz swoje istream_iterator<string>
s na istream_iterator<char>
, które powinno naprawić błąd.
Lol, to jest niesamowite. Czy to pomaga w przyspieszeniu? Tam naprawdę było potrzebne. –
@TED: Tak: http://www.bdsoft.com/dist/vcmeta-demo.txt (jest lepiej, ale nie rewelacyjnie) –