如何阅读涉及模板的c ++错误

时间:2010-09-14 17:16:00

标签: c++

我正在学习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;
}

5 个答案:

答案 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 assignmentstr_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>