0 / 0 / 0
Регистрация: 14.07.2016
Сообщений: 30
1

C2676. Бинарный "++": не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

20.08.2017, 17:19. Показов 9085. Ответов 8

Author24 — интернет-сервис помощи студентам
Учу C++ по книге, в конце главы есть задание: написать функцию подсчета символов к классу Document.
Не работает переход по итераторам. Не могу понять в чем проблема.

document.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <list>
#include <vector>
#include <iostream>
using namespace std;
 
using Line = vector<char>;
 
class Text_iterator {
    list<Line>::iterator ln;
    Line::iterator pos;
 
public:
    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); }
};
 
struct Document {
    list<Line> line;
    Document() { line.push_back(Line{}); }
 
    Text_iterator begin() { return Text_iterator(line.begin(), line.begin()->begin()); }
    Text_iterator end() { return Text_iterator(line.end(), line.end()->end()); }
 
    int count();
};
 
istream& operator>> (istream& is, Document& d) {
    for (char ch; is.get(ch);) {
        d.line.back().push_back(ch);
        if (ch == '\n') d.line.push_back(Line{});
            
    }
    
    if (d.line.back().size()) d.line.push_back(Line{});
 
    return is;
}
document.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "document.h"
 
Text_iterator& Text_iterator::operator++ () {
    pos++;
    if (pos == ln->end()) {
        ln++;
        pos == ln->begin();
    }
 
    return *this;
}
 
int Document::count() {
    int count = 0;
    Text_iterator q = begin();
    while (q != end()) {
        count++;
        q++;
    }
    return count;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2017, 17:19
Ответы с готовыми решениями:

Ошибка C2676. Бинарный "++" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Не могу исправить ошибку C2676. Заранее спасибо #include &lt;iostream&gt; #include &lt;cmath&gt; using...

Ошибка: не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Здравствуйте! Не могу понять, почему так нельзя делать (Ошибка: не определяет этот оператор или...

ошибки "Complex" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
заголовочный файл #include &lt;iostream&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

бинарный "++": "Counter" не определяет этот оператор или преобразование к типу приемлемо к встроенному
бинарный &quot;++&quot;: &quot;Counter&quot; не определяет этот оператор или преобразование к типу приемлемо к...

Ошибка компилятора C2676 "бинарный == ... не определяет этот оператор"
Ошибка бинарный &quot;==&quot;: &quot;std::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt;&gt;&quot; не...

8
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
20.08.2017, 22:08 2
A1lexen,
Цитата Сообщение от A1lexen Посмотреть сообщение
Не работает переход по итераторам. Не могу понять в чем проблема.
Проблема в том, что вы написали только определение инкремента/декремента.
C++
1
Text_iterator& operator++ ();
Для данного перегруженного оператора нужно писать еще и определение.
0
0 / 0 / 0
Регистрация: 14.07.2016
Сообщений: 30
20.08.2017, 22:10  [ТС] 3
Я написал определение в другом файле, код из которого вставил внизу. Разве для перегрузки операторов определение должно быть сразу после объявления?
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
20.08.2017, 22:26 4
Цитата Сообщение от A1lexen Посмотреть сообщение
Я написал определение в другом файле, код из которого вставил внизу. Разве для перегрузки операторов определение должно быть сразу после объявления?
Извините, сразу не заметил. Нет, не нужно.

Добавлено через 7 минут
Для чего нужна эта строка?
C++
1
pos == ln->begin();
Так и должно быть?
0
0 / 0 / 0
Регистрация: 14.07.2016
Сообщений: 30
20.08.2017, 23:01  [ТС] 5
Каждая строка - вектор символов,
C++
1
pos == ln->begin();
переводит итератор на первый символ строки
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
20.08.2017, 23:25 6
C++
1
2
3
4
5
while (q != end())
    {
        count++;
        ++q;
    }
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
21.08.2017, 00:25 7
A1lexen, Тогда, наверное, должно быть так:
C++
1
pos = ln->begin();
0
0 / 0 / 0
Регистрация: 14.07.2016
Сообщений: 30
21.08.2017, 12:08  [ТС] 8
Точно, не заметил, что случайно поставил оператор ровно, вместо присваивания.

Добавлено через 3 минуты
С префиксной формой появляется другая ошибки
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
21.08.2017, 16:17 9
A1lexen, Какие именно ошибки?
0
21.08.2017, 16:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2017, 16:17
Помогаю со студенческими работами здесь

Ошибка C2676 бинарный "[": "matr" не определяет этот оператор
Компилятор возмущается:( Выдает ошибки: отсутствует оператор &quot;&quot;, соответствующий этим операндам...

бинарный ">>" не определяет этот оператор
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void main() { int a1, b1, a2, b2;...

бинарный ">>" не определяет этот оператор
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void main() { int a1, b1, a2, b2;...

Не определяет оператор или преобразование в тип
Не определяет оператор или преобразование в тип: Error 1 error C2676: binary '*' :...

Бинарный "+": не найден оператор, принимающий левый операнд типа "const_Ty" (или приемлемое преобразование отсутствует)
Работа с декой Есть два класса. В одном описан пользовательский тип данных В другом - работа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru