2010-09-14 57 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>,應該修復該錯誤。