您显示的特定错误消息应该只是 g++ 发出的错误的一部分。完整的错误应该看起来更接近以下内容(我已经缩短了路径,这个输出来自 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.
这不是更友好,是吗? :-) 错误中有用的行是末尾的行,而不是开头的行。错误消息以相反的顺序发出:第一个错误是实际错误,随后的几行通过显示编译器如何到达那里的源代码为您提供面包屑。最后一行显示了错误在您的源代码中的位置:
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
在我的示例文件中,t.cpp:16 是以下行:
string s(begin,end);
如果您注释掉该行(以及它后面使用s 的行),您会发现您的源代码编译没有错误。
此时,应该很清楚您错误地使用了std::string 构造函数,这意味着您传递给它的参数类型错误。你给它的东西有std::string(这就是std::basic_string<char>),它期待有char的东西。
如果您查阅std::string 的文档,您会发现它确实有一个如下构造函数:
template <typename InputIterator>
string(InputIterator first, InputIterator last);
这些输入迭代器允许您从一系列字符中创建一个字符串。但是,您将std::strings 的范围传递给构造函数。如果您将 istream_iterator<string>s 更改为 istream_iterator<char>,则应该可以修复错误。