我正在学习C ++。我经常会收到类似这样的错误
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c ++ / bits / basic_string.h:1458:从'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&gt ;, _CharT = char,_Traits = std: :char_traits,_Alloc = std :: allocator]'
我如何理解这一点,以便至少可以找到一些地方来寻找解决方案?
如果您感兴趣,原始代码为:
#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;
}
答案 0 :(得分:6)
这不是整个错误,只是对一个实例化的描述。
基本上你关心:
1)代码中的哪一行触发了错误(string s(begin,end);
)
2)它导致了什么错误(例如cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment
)和
3)您可以比较编译器所说的模板参数,以及您认为它们是什么。
可能需要一些经验,不要害怕错误,这肯定有助于了解图书馆。
在这种情况下,原因是字符串的构造函数需要一系列字符,但是您传递的是一系列字符串。
答案 1 :(得分:5)
使用STLFilt。
答案 2 :(得分:3)
Comeau有更友好的编译器,在网上查看: http://www.comeaucomputing.com/tryitout/
例如,这是错误:
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"string", line 1175: error: no suitable conversion function from
"const std::string" to "char" exists
push_back(*__first);
^
detected during instantiation of "std::basic_string<_CharT, _Traits,
_Alloc> &std::basic_string<_CharT, _Traits,
_Alloc>::append(_InputIter, _InputIter,
std::input_iterator_tag) [with _CharT=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>,
_InputIter=std::istream_iterator<std::string, char,
std::char_traits<char>, ptrdiff_t>]" at line 624
1 error detected in the compilation of "ComeauTest.c".
这使我假设构造函数需要char迭代器而不是字符串上的迭代器(如许多字符串中所示):
istream_iterator<char> begin(ifile);
istream_iterator<char> end;
答案 3 :(得分:2)
您实际上省略了错误消息的关键部分。你在g ++ 4.2中得到两个重复的错误。关键部分是:
/path/basic_string.tcc:103: error: cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment
和str_iter_test.C:15: instantiated from here
。
第一部分表示它无法从字符串转换为字符,第二部分表示错误发生在哪一行,在本例中为string s(begin,end);
。
在这种情况下,您的迭代器应该迭代char
而不是string
:
istream_iterator<char> begin(ifile);
istream_iterator<char> end;
答案 4 :(得分:1)
您显示的特定错误消息应该只是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::string
s传递给构造函数。如果您将istream_iterator<string>
更改为应修复错误的istream_iterator<char>
。