在c ++中获取基本的文本处理器进行编译 [英] Getting basic text processor in c++ to compile

查看:271
本文介绍了在c ++中获取基本的文本处理器进行编译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

As stated in the subject i am in trouble getting a basic text processor to compile. The following code works in basic parts. That means. when find_text() and match() functions are excluded it gets a text file and reads it into a Document class and outputs it using print(). But when i include above mentioned functions and try to compile it gives large amount of error messages.

这段代码来自Stroustrup编程:使用c ++的实践和原理第20章。在练习中,我应该获取运行示例代码部分并继续编写match功能。任何人都可以指出代码中的错误?我使用Visual studio 2013和CTP 2013年11月编译器。

This code is from Stroustrup "Programming: practice and principles using c++" Chapter 20. In the exercises i should get sample code parts to run and continue writing a match() function. Can anyone point out the mistake in code? I am using Visual studio 2013 and a CTP November 2013 compiler.

#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


推荐答案

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

When you use a custom iterator when calling a function in the standard library, they have some expectations.

我看到错误:

'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 来修复编译器问题。

Take a look at the http://en.cppreference.com/w/cpp/iterator/iterator to understand what's expected of an iterator. You can fix your compiler problems by deriving Text_iterator from std::iterator.

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

这篇关于在c ++中获取基本的文本处理器进行编译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆