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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
#1

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

27.07.2012, 22:01. Просмотров 2973. Ответов 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'
подскажите где ошибка и как исправить
заранее спасибо всем
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2012, 22:01     E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary'
Посмотрите здесь:
C++ С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить?
C++ Error C2679: binary '>>': no operator found which takes a right-hand operand of type
C++ Ошибка: error C2679: binary '<<' : no operator found which takes a right-hand operand of type
Multimap. Ошибка operator+ not implemented in type multimap C++
Ошибка "binary '==': no operator found which takes a left-hand operand of type" C++
Исправить ошибку "error C2679: binary '*' : no operator found which takes a right-hand operand of type" C++
C++ [Error] 'ostream' does not name a type
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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
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
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
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
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
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++
Could not convert variant of type (Null) into type (String) C++
ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? C++
C++ friend ostream &operator<<(ostream &stream, MyClass o);
C++ Mix of type 'bool' and type 'float'

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

Или воспользуйтесь поиском по форуму:
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'
Ответ Создать тему
Опции темы

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