2015-11-06 50 views
0

正如在主题中所述,我很难得到一个基本的文本处理器来编译。以下代码在基本部分中起作用。这意味着。当find_text()和match()函数被排除时,它将获取一个文本文件并将其读入一个Document类并使用print()输出它。但是,当我包含上面提到的功能,并尝试编译它给出了大量的错误信息。在C++中获取基本的文本处理器来编译

此代码来自Stroustrup“Programming:practice and principles using C++”第20章。在练习中,我应该获取示例代码部分以运行并继续编写match()函数。任何人都可以指出代码中的错误?我正在使用Visual Studio 2013和2013年11月的CTP编译器。是

#include <algorithm> 
#include <string> 
#include <vector> 
#include <iostream> 
#include<fstream> 
#include<sstream> 
#include <list> 

using namespace std; 

using Line = vector<char>; // a line is a vector of characters 

//....................TEXT ITERATOR CLASS...................... 

class Text_iterator { // keep track of line and character position within   a line 
    list<Line>::iterator ln; 
    Line::iterator pos; 
public: 
    // start the iterator at line ll’s character position pp: 
    Text_iterator(list<Line>::iterator ll, Line::iterator pp) 
     :ln { ll }, pos { pp } { } 

    char& operator*() { return *pos; } 

    Text_iterator& operator++(); 

    bool operator==(const Text_iterator& other) const { 
     return ln == other.ln && pos == other.pos; 
    } 
    bool operator!=(const Text_iterator& other) const { 
     return !(*this == other); 
    } 
}; 

Text_iterator& Text_iterator::operator++() { 
    ++pos; // proceed to next character 
    if (pos == (*ln).end()) { 
     ++ln; // proceed to next line 
     pos = (*ln).begin(); // bad if ln==line.end(); so make sure it isn’t 
    } 
    return *this; 
} 

//....................DOCUMENT CLASS...................... 

struct Document { 
    list<Line> line;   //doucument is a list of lines 
    Document() { line.push_back(Line { }); } 


    Text_iterator begin() // first character of first line 
    { 
     return Text_iterator(line.begin(), (*line.begin()).begin()); 
    } 
    Text_iterator end() // one beyond the last character of the last line 
    { 
     auto last = line.end(); 
     --last; // we know that the document is not empty 
     return Text_iterator(last, (*last).end()); 
    } 
}; 

istream& operator>>(istream& is, Document& d) { 
    for (char ch; is.get(ch);) { 
     d.line.back().push_back(ch); // add the character 
     if (ch == '\n') 
      d.line.push_back(Line { }); // add another line 
    } 
    if (d.line.back().size()) d.line.push_back(Line { }); // add final empty line 
    return is; 
} 

//....................HELPER FUNCTIONS...................... 

void erase_line(Document& d, int n) { 
    if (n < 0 || d.line.size() - 1 <= n) return; 
    auto p = d.line.begin(); 
    advance(p, n); 
    d.line.erase(p); 
} 

void print(Document& d) { 
    for (auto p : d) cout << p; 
    // int the book sample code is different: "cout<<*p"` but the book code gives error of illegal transition. This would also need a comment 
} 

/* 
bool match(Text_iterator first, Text_iterator last, const string& s) { 

    for (int i = 0; i < s.size(); ++i) { 
     if (*first == s[i]); 
     if (*first != s[i])return false; 
    } 
    return true; 
} 

Text_iterator find_txt(Text_iterator first, Text_iterator last, const string& s) { 
    if (s.size() == 0) return last; // can’t find an empty string 
    char first_char = s[0]; 
    while (true) { 
     auto p = find(first, last, first_char); 
     if (p == last || match(p, last, s)) return p; 
     first = ++p; // look at the next character 
    } 
} 
*/ 

int main() { 

    string filename1 = "myDoc.txt"; 
    ifstream stream { filename1 }; 

    Document text1; 

    stream >> text1; 

    print(text1); 

    char ch; cin >> ch; 
} 

我得到的错误如下:

Error 6 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 text processing proov 
Error 11 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 text processing proov 
Error 16 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 text processing proov 
Error 21 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 text processing proov 
Error 26 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 text processing proov 
Error 13 error C2868: 'std::iterator_traits<_InIt>::value_type' : illegal syntax for using-declaration; expected qualified-name c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 text processing proov 
Error 28 error C2868: 'std::iterator_traits<_InIt>::reference' : illegal syntax for using-declaration; expected qualified-name c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 text processing proov 
Error 23 error C2868: 'std::iterator_traits<_InIt>::pointer' : illegal syntax for using-declaration; expected qualified-name c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 text processing proov 
Error 8 error C2868: 'std::iterator_traits<_InIt>::iterator_category' : illegal syntax for using-declaration; expected qualified-name c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 text processing proov 
Error 18 error C2868: 'std::iterator_traits<_InIt>::difference_type' : illegal syntax for using-declaration; expected qualified-name c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 text processing proov 
Error 29 error C2665: 'std::_Debug_range2' : none of the 2 overloads could convert all the argument types c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 584 1 text processing proov 
Error 12 error C2602: 'std::iterator_traits<_InIt>::value_type' is not a member of a base class of 'std::iterator_traits<_InIt>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 text processing proov 
Error 27 error C2602: 'std::iterator_traits<_InIt>::reference' is not a member of a base class of 'std::iterator_traits<_InIt>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 text processing proov 
Error 22 error C2602: 'std::iterator_traits<_InIt>::pointer' is not a member of a base class of 'std::iterator_traits<_InIt>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 text processing proov 
Error 7 error C2602: 'std::iterator_traits<_InIt>::iterator_category' is not a member of a base class of 'std::iterator_traits<_InIt>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 text processing proov 
Error 17 error C2602: 'std::iterator_traits<_InIt>::difference_type' is not a member of a base class of 'std::iterator_traits<_InIt>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 text processing proov 
Error 10 error C2146: syntax error : missing ';' before identifier 'value_type' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 text processing proov 
Error 25 error C2146: syntax error : missing ';' before identifier 'reference' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 text processing proov 
Error 20 error C2146: syntax error : missing ';' before identifier 'pointer' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 text processing proov 
Error 5 error C2146: syntax error : missing ';' before identifier 'iterator_category' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 text processing proov 
Error 15 error C2146: syntax error : missing ';' before identifier 'difference_type' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 text processing proov 
Error 9 error C2039: 'value_type' : is not a member of 'Text_iterator' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 372 1 text processing proov 
Error 24 error C2039: 'reference' : is not a member of 'Text_iterator' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 376 1 text processing proov 
Error 19 error C2039: 'pointer' : is not a member of 'Text_iterator' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 375 1 text processing proov 
Error 4 error C2039: 'iterator_category' : is not a member of 'Text_iterator' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 371 1 text processing proov 
Error 14 error C2039: 'difference_type' : is not a member of 'Text_iterator' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 373 1 text processing proov 

回答

3

当你在标准库中调用函数时,使用自定义的迭代器,他们有一定的预期。

我看到的错误:

'value_type' : is not a member of 'Text_iterator' 
'reference' : is not a member of 'Text_iterator' 
'pointer' : is not a member of 'Text_iterator' 
'iterator_category' : is not a member of 'Text_iterator' 
'difference_type' : is not a member of 'Text_iterator' 

看看在http://en.cppreference.com/w/cpp/iterator/iterator明白什么是预期迭代器。您可以通过从std::iterator派生Text_iterator来修复编译器问题。

class Text_iterator : public std::iterator<std::input_iterator_tag, char> { 
    ... 
}; 
+0

谢谢你现在的作品,我可以继续写功能。据我所知,问题是在Text_iterator类的声明语法中,而不是该类不符合要求。我复制了这本书的内容,并假定他们未经修改就开始工作,并假定我在其他地方犯了一个错误。仍然存在一个问题。如果我使用print()函数的书中的代码,我会得到非法的间接错误。如果删除解引用操作符,代码将起作用。那里有什么问题。 – fredric