Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:01     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #1
Здравствуйте, уважаемые форумчане, выкидываю код:
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'
подскажите где ошибка и как исправить
заранее спасибо всем
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
27.07.2012, 22:07     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #2
написать
C++
1
#include <string>
хотя тут в коде есть.. хм.. у меня такой ошибки нет в вижл студио
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:09     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #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.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:18  [ТС]     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #4
ну-ка, не понял а собственно зачем
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Используйте темп-переменную типа char и явно создавайте экземпляры класса Binary.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:21     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #5
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
Binary::Binary(const char *b)
{
data = b;
}
Есть вышеуказанный конструктор.
Пишем
C++
1
2
3
char tmp[255];
std::cin >> tmp;
Binary x(tmp);
Получили элемент х со строкой внутри из переменной tmp.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:33  [ТС]     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #6
не работает
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:37     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #7
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
не работает
Быть может скажете почему?
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:39  [ТС]     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #8
не понимаю, если все верно, почему ошибку выдает
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:40     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #9
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
почему ошибку выдает
КАКУЮ ошибку выдает?
Телепаты тут не обитают.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:41  [ТС]     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #10
да ту же самую
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:41     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #11
Чего то недоисправили.
Код в студию.
И ошибку.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:47  [ТС]     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #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'
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:50     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #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.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
27.07.2012, 22:52  [ТС]     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #14
а покажите плиз
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2012, 22:54     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary'
Еще ссылки по теме:

Incomplete type used in nested type specifier - Итерация по списку аргументов C++
Friend ostream& operator<<(ostream& stream, CArr& obj); C++
Multimap. Ошибка operator+ not implemented in type multimap C++

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

Или воспользуйтесь поиском по форуму:
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
27.07.2012, 22:54     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' #15
Определите для Вашего класса метод
C++
1
string Binary::toString(){ return data; }
И при выводе
C++
1
std::cout   << "a + b + c = " << (a + b + c).toString() << std::endl;
Yandex
Объявления
27.07.2012, 22:54     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary'
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru