【问题标题】:How to read c++ errors involving templates如何阅读涉及模板的 C++ 错误
【发布时间】:2011-04-12 07:04:30
【问题描述】:

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

【问题讨论】:

    标签: c++


    【解决方案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&lt;char&gt;),它期待有char的东西。

    如果您查阅std::string 的文档,您会发现它确实有一个如下构造函数:

    template <typename InputIterator>
    string(InputIterator first, InputIterator last);
    

    这些输入迭代器允许您从一系列字符中创建一个字符串。但是,您将std::strings 的范围传递给构造函数。如果您将 istream_iterator&lt;string&gt;s 更改为 istream_iterator&lt;char&gt;,则应该可以修复错误。

    【讨论】:

      【解决方案2】:

      您实际上省略了错误消息的关键部分。在 g++ 4.2 中出现两个重复错误。关键部分是: /path/basic_string.tcc:103: error: cannot convert 'const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' to 'char' in assignmentstr_iter_test.C:15: instantiated from here

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

      在这种情况下,您的迭代器应该迭代 char 而不是 string

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

      【讨论】:

        【解决方案3】:

        这不是整个错误,只是对一个实例化的描述。

        基本上你关心的是:

        1) 代码中的哪一行触发了错误 (string s(begin,end);)

        2) 它导致了什么错误(例如cannot convert 'const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' to 'char' in assignment)以及在哪里

        3) 您可能会比较编译器所说的模板参数是什么,以及您假设它们是什么。

        可能需要一些经验才能不害怕错误,而且对库的了解肯定会有所帮助。

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

        【讨论】:

          【解决方案4】:

          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;
          

          【讨论】:

          • 在我看来,你的错误消息中的 push_back 部分让我很困惑......首先,它与手头的问题无关。不过前两行更好,我不得不承认:)
          • @ruben 有时不得不接受直觉
          【解决方案5】:

          使用STLFilt

          【讨论】:

          • 哈哈,太棒了。对提升有帮助吗?这才是它真正需要的地方。
          • @T.E.D.:是的:bdsoft.com/dist/vcmeta-demo.txt(更好,但不是很好)
          猜你喜欢
          • 1970-01-01
          • 2015-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          相关资源
          最近更新 更多