2010-09-14 61 views
7

我正在学习C++。我经常得到看起来像这样的如何读取涉及模板的C++错误

/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]'

错误我如何理解这一点,这样我至少可以有一些地方寻找一个解决方案?

如果你有兴趣,原来的代码是:

#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; 
} 

回答

6

这不是整个错误,只是一个descripti一个实例化。

基本上你在乎:

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)你可以比较一下编译器说的模板参数是什么,以及你认为它们是什么。

它可能需要一些经验,不要害怕错误,它肯定有助于了解图书馆。

在这种情况下,原因是字符串的构造函数需要一个字符范围,但是您传递的是一系列字符串。

5

使用STLFilt

+0

哈哈,那真棒。它有助于提升吗?这正是它真正需要的地方。 – 2010-09-14 17:38:38

+0

@TED:是:http://www.bdsoft.com/dist/vcmeta-demo.txt(它更好,但不是很棒) – 2010-09-14 17:50:21

3

科莫有非常非常友好的编译器,检查它的在线: 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". 

这使我认为构造预计烧焦iterarator而不是迭代器(如许多字符串):

istream_iterator<char> begin(ifile); 
istream_iterator<char> end; 
+0

在我看来,错误信息中的push_back部分会随着我的想法而混乱......首先,它与手头的问题无关。前两行是更好的,但我不得不承认:) – rubenvb 2010-09-14 19:06:16

+0

@ruben有时必须带着直觉feelinh – Anycorn 2010-09-14 19:29:38

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 assignmentstr_iter_test.C:15: instantiated from here

第一部分表示它不能将字符串转换为字符,第二部分表示在哪一行发生错误,在本例中为string s(begin,end);

在这种情况下,你应该迭代器遍历charstring

istream_iterator<char> begin(ifile); 
istream_iterator<char> end; 
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传递给构造函数。如果您将istream_iterator<string>更改为istream_iterator<char>,应该修复该错误。