在c ++中获取基本文本处理器进行编译

时间:2015-11-06 17:09:55

标签: c++ visual-c++

如上所述,我在编写基本文本处理器时遇到了麻烦。以下代码适用于基本部分。这意味着。当find_text()和match()函数被排除时,它获取一个文本文件并将其读入Document类并使用print()输出。但是当我包含上面提到的函数并尝试编译它时会产生大量的错误消息。

这段代码来自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

1 个答案:

答案 0 :(得分: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以了解迭代器的预期。您可以通过从Text_iterator派生std::iterator来修复编译器问题。

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