Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
1

E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary'

27.07.2012, 22:01. Просмотров 5310. Ответов 14
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане, выкидываю код:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <string>
#include <windows.h>
 
class Binary
{
        public:
    Binary(const Binary& b = "");
    Binary& operator=(const Binary& b);
    Binary(const char*      b);
    Binary& operator +=(const Binary& b);
    Binary& operator -=(const Binary& b);
    friend ostream& operator <<(std::ostream& s, Binary& b)
    { return std::cout << b.data;}
    friend std::istream& operator >>(std::istream& s, Binary& b)
    { return std::cin  >> b.data;}
        private:
    std::string data;
};
 
Binary operator +(const Binary& a, const Binary& b);
Binary operator -(const Binary& a, const Binary& b);
 
Binary::Binary(const char *b)
{
        data = b;
}
 
Binary::Binary(const Binary &b)
{
        *this = b;
}
Binary& Binary::operator =(const Binary& b)
{
        data = b.data;
        return *this;
}
 
Binary& Binary::operator +=(const Binary& b)
{
        Binary t(b);                                    // Модифицировать не имеем право...
        // Определяем наиболее длинную строку и ту,
        // которая короче, дополняем справа нулями.
        std::string tmp(labs(data.length()-t.data.length()),'0');
        if(data.length() > t.data.length())
                t.data = tmp + t.data;
        else
                data = tmp + data;
 
        // Создаём два обратных итератора, т.к. двигаться будем
        // в обратном направлении. т.е. с конца строки в начало.
        std::string::reverse_iterator riData = data.rbegin();
        std::string::reverse_iterator riBData = t.data.rbegin();
        int c = 0;                                              // Флаг переноса.
        while(riData != data.rend())    // Двигаемся по строке с конца в начало.
        {
                int i1 = *riData - 0x30;        // Преобразовываем символы в числа.
                int i2 = *riBData - 0x30;       // !!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!
                int res = i1 + i2 + c;          // Вот оно сложение.
                c  = (res & 2) >> 1;            // Корректируем флаг переноса
                res &= 1;                                       // После этого корректируем результат.
                *riData = res + 0x30;           // Записываем обратно, преобразовав обратно в символ
                riData++; riBData++;            // Двигаемся дальше...
        }
        if(c)                                                   // Если переполнение
                data = '1' + data;
        return *this;
}
 
Binary& Binary::operator -=(const Binary& b)
{
        Binary t(b);                                    // Модифицировать не имеем право...
        // Определяем наиболее длинную строку и ту,
        // которая короче, дополняем справа нулями.
        std::string tmp(labs(data.length()-t.data.length()),'0');
        if(data.length() > t.data.length())
                t.data = tmp + t.data;
        else
                data = tmp + data;
 
        // Создаём два обратных итератора, т.к. двигаться будем
        // в обратном направлении. т.е. с конца строки в начало.
        std::string::reverse_iterator riData = data.rbegin();
        std::string::reverse_iterator riBData = t.data.rbegin();
        int c = 0;                                              // Флаг переноса.
        while(riData != data.rend())    // Двигаемся по строке с конца в начало.
        {
                int i1 = *riData - 0x30;        // Преобразовываем символы в числа.
                int i2 = *riBData - 0x30;       // !!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!
                int res = i1 - i2 - c;          // Вот оно вычитание.
                c  = (res & 2) >> 1;            // Корректируем флаг переноса
                res &= 1;                                       // После этого корректируем результат.
                *riData = res + 0x30;           // Записываем обратно, преобразовав обратно в символ
                riData++; riBData++;            // Двигаемся дальше...
        }
        if(c)                                                   // Если переполнение
                data = '1' + data;
        return *this;
}
 
// ----Утилиты класса----
// После опрелеленных функций +=,  -= и =
// функции сложения и вычитания определяются тривиально:
Binary operator +(const Binary& a, const Binary& b)
{
        Binary t = a;
        return t += b;
}
 
Binary operator -(const Binary& a, const Binary& b)
{
        Binary t = a;
        return t -= b;
}
 
 
int main()
{
    std::string mes = "Введите через пробел 3 двоичных чила: ";
    char res[100] ;
    CharToOem(mes.c_str(), res);
    std::cout << res;
 
    Binary a, b, c;
    std::cin >> a >> b >> c;
    std::cout   << "a = " << a << std::endl
                << "b = " << b << std::endl
                << "c = " << c << std::endl;
 
    std::cout   << "a + b + c = " << a + b + c << std::endl
                << "a + b - c = " << a + b - c << std::endl
                << "a - b + c = " << a - b + c << std::endl
                << "a - b - c = " << a - b - c << std::endl;
    return 0;
}
Ругается на это
[C++ Error] Unit1.cpp(130): E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary'
подскажите где ошибка и как исправить
заранее спасибо всем
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2012, 22:01
Ответы с готовыми решениями:

Ошибка: E2093 operator '<' not implemented in type 'myString' for arguments of the same type
Пишет _function_base.h(73):E2093'operator&lt;'not implemented in type 'myString' for arguments of the...

С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить?
Написал программу для расчёта площади четырёхугольника и круга. Использовал простые операторы...

E2094 'operator>>' not implemented in type 'ostream' for arguments of type 'int'
Начал осваивать C++ по Дейтелу &quot;как программировать на с++&quot;. Пользуюсь Borland C++ Builder 6....

Ошибка: 'operator<<' not implemented in type 'istream' for arguments of type 'int'
Создаем самую простую прогу: int sgrt(int); #pragma argsused int main(int argc, char* argv) { ...

14
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
27.07.2012, 22:07 2
написать
C++
1
#include <string>
хотя тут в коде есть.. хм.. у меня такой ошибки нет в вижл студио
1
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:09 3
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
std::cin >> a >> b >> c;
Для класса cin (или что оно там такое, уже не помню =)) для оператора ">>" не определено перегруженной ф-ии, принимающей аргумент типа Binary.
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
C++
1
2
3
4
Binary::Binary(const char *b)
{
        data = b;
}
Используйте темп-переменную типа char и явно создавайте экземпляры класса Binary.
1
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:18  [ТС] 4
ну-ка, не понял а собственно зачем
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Используйте темп-переменную типа char и явно создавайте экземпляры класса Binary.
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:21 5
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
Binary::Binary(const char *b)
{
data = b;
}
Есть вышеуказанный конструктор.
Пишем
C++
1
2
3
char tmp[255];
std::cin >> tmp;
Binary x(tmp);
Получили элемент х со строкой внутри из переменной tmp.
1
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:33  [ТС] 6
не работает
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:37 7
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
не работает
Быть может скажете почему?
1
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:39  [ТС] 8
не понимаю, если все верно, почему ошибку выдает
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:40 9
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
почему ошибку выдает
КАКУЮ ошибку выдает?
Телепаты тут не обитают.
1
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:41  [ТС] 10
да ту же самую
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:41 11
Чего то недоисправили.
Код в студию.
И ошибку.
1
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:47  [ТС] 12
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream.h>
#include <string>
#include <windows.h>
 
class Binary
{
        public:
    Binary(const Binary& b = "");
    Binary& operator=(const Binary& b);
    Binary(const char*      b);
    Binary& operator +=(const Binary& b);
    Binary& operator -=(const Binary& b);
    friend ostream& operator <<(std::ostream& s, Binary& b)
    { return std::cout << b.data;}
    friend std::istream& operator >>(std::istream& s, Binary& b)
    { return std::cin  >> b.data;}
        private:
    std::string data;
};
 
Binary operator +(const Binary& a, const Binary& b);
Binary operator -(const Binary& a, const Binary& b);
 
Binary::Binary(const char *b)
{
        data = b;
}
 
Binary::Binary(const Binary &b)
{
        *this = b;
}
Binary& Binary::operator =(const Binary& b)
{
        data = b.data;
        return *this;
}
 
Binary& Binary::operator +=(const Binary& b)
{
        Binary t(b);                                    // Модифицировать не имеем право...
        // Определяем наиболее длинную строку и ту,
        // которая короче, дополняем справа нулями.
        std::string tmp(labs(data.length()-t.data.length()),'0');
        if(data.length() > t.data.length())
                t.data = tmp + t.data;
        else
                data = tmp + data;
 
        // Создаём два обратных итератора, т.к. двигаться будем
        // в обратном направлении. т.е. с конца строки в начало.
        std::string::reverse_iterator riData = data.rbegin();
        std::string::reverse_iterator riBData = t.data.rbegin();
        int c = 0;                                              // Флаг переноса.
        while(riData != data.rend())    // Двигаемся по строке с конца в начало.
        {
                int i1 = *riData - 0x30;        // Преобразовываем символы в числа.
                int i2 = *riBData - 0x30;       // !!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!
                int res = i1 + i2 + c;          // Вот оно сложение.
                c  = (res & 2) >> 1;            // Корректируем флаг переноса
                res &= 1;                                       // После этого корректируем результат.
                *riData = res + 0x30;           // Записываем обратно, преобразовав обратно в символ
                riData++; riBData++;            // Двигаемся дальше...
        }
        if(c)                                                   // Если переполнение
                data = '1' + data;
        return *this;
}
 
Binary& Binary::operator -=(const Binary& b)
{
        Binary t(b);                                    // Модифицировать не имеем право...
        // Определяем наиболее длинную строку и ту,
        // которая короче, дополняем справа нулями.
        std::string tmp(labs(data.length()-t.data.length()),'0');
        if(data.length() > t.data.length())
                t.data = tmp + t.data;
        else
                data = tmp + data;
 
        // Создаём два обратных итератора, т.к. двигаться будем
        // в обратном направлении. т.е. с конца строки в начало.
        std::string::reverse_iterator riData = data.rbegin();
        std::string::reverse_iterator riBData = t.data.rbegin();
        int c = 0;                                              // Флаг переноса.
        while(riData != data.rend())    // Двигаемся по строке с конца в начало.
        {
                int i1 = *riData - 0x30;        // Преобразовываем символы в числа.
                int i2 = *riBData - 0x30;       // !!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!
                int res = i1 - i2 - c;          // Вот оно вычитание.
                c  = (res & 2) >> 1;            // Корректируем флаг переноса
                res &= 1;                                       // После этого корректируем результат.
                *riData = res + 0x30;           // Записываем обратно, преобразовав обратно в символ
                riData++; riBData++;            // Двигаемся дальше...
        }
        if(c)                                                   // Если переполнение
                data = '1' + data;
        return *this;
}
 
// ----Утилиты класса----
// После опрелеленных функций +=,  -= и =
// функции сложения и вычитания определяются тривиально:
Binary operator +(const Binary& a, const Binary& b)
{
        Binary t = a;
        return t += b;
}
 
Binary operator -(const Binary& a, const Binary& b)
{
        Binary t = a;
        return t -= b;
}
 
 
int main()
{
    std::string mes = "Введите через пробел 3 двоичных чила: ";
    char res1[100],res2[100],res3[100];
    //CharToOem(mes.c_str(), res);
    //std::cout << res;
 
    Binary a(res1), b(res2), c(res3);
    std::cin >> res1 >> res2 >> res3;
    std::cout   << "a = " << a << std::endl
                << "b = " << b << std::endl
                << "c = " << c << std::endl;
 
    std::cout   << "a + b + c = " << a + b + c << std::endl
                << "a + b - c = " << a + b - c << std::endl
                << "a - b + c = " << a - b + c << std::endl
                << "a - b - c = " << a - b - c << std::endl;
    return 0;
}
[C++ Error] Unit1.cpp(130): E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary'
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:50 13
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Для класса cin для оператора ">>" не определено перегруженной ф-ии, принимающей аргумент типа Binary.
C++
1
2
3
4
Binary::Binary(const char *b)
{
        data = b;
}
Используйте темп-переменную типа char и явно создавайте экземпляры класса Binary.
Аналогично и для cout.

Добавлено через 1 минуту
C++
1
2
Binary operator +(const Binary& a, const Binary& b);
Binary operator -(const Binary& a, const Binary& b);
Результат - все тот же Binary.
1
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:52  [ТС] 14
а покажите плиз
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:54 15
Определите для Вашего класса метод
C++
1
string Binary::toString(){ return data; }
И при выводе
C++
1
std::cout   << "a + b + c = " << (a + b + c).toString() << std::endl;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2012, 22:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка в C++ Builder ( 'operator<<' not implemented in type 'Pages' for arguments of type)
Доброго времени суток! помогите пожалуйста, у меня не выводит из контейнера map. #include...

Ошибка binary '=' : no operator found which takes a right-hand operand of type
Ошибка Erro1 error C2679: binary '=' : no operator found which takes a right-hand operand of type...

Binary '==' no operator found which takes a left-hand operand of type 'T'
Здравствуйте. Пытаюсь сравнить элемент массива с объектом,который я создаю в мейн и компилятор...

Error C2679: binary '>>': no operator found which takes a right-hand operand of type
нужно написать программу обработки структур. в программе использовать структуру, содержащую поля с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.