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

Как исправить ошибку с перегруженным оператором - C++

Восстановить пароль Регистрация
 
klukvennya
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 6
06.06.2012, 19:52     Как исправить ошибку с перегруженным оператором #1
Добрый вечер!
суть задания: Необходимо реализовать класс, который умеет хранить данные произвольных типов (int, char, любой другой объект класса - TComplex и CooperBy).

error C2593: неоднозначный 'operator <<'
выдает в главной ф-ции там, где написано cout
объясните пожалуйста в чем ошибка? как нужно?как избежать этого?

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
template <class T>                          //структура элемента стека
struct elem 
{
    T info;                                 // ячейка, содержащая информацию
    elem *next;                             // ячейка, содержащая адрес на следующий элемент
};
 
template <class ST>                         // стек
class STACK
{
private:
    elem <ST> *H;                           // указатель на начало стека
public:
    STACK() {H=NULL;}                       // констуктор
    ~STACK();                               // деструктор 
 
    void Push(ST);                          // помещение эл-та 
    ST Pop(void);                           // извлечение эл-та 
    void OutPut();                          // распечатка содержимого стека
    void Clear();                           // разрушение стека 
    void Menu(ST v);                        // меню
 
    friend ostream& operator<<(ostream &, ST &); // дружественная функция вывода
    friend istream& operator>>(istream &, ST &); // дружественная функция ввода
};
 
...
 
template <class ST>
ostream& operator<<(ostream &out, ST &s)
{
    out << s ;
    return out;
}   
 
template <class ST>
istream& operator>>(istream &in, ST &s)
{
    in >> s ;
    return in;
}
 
template <class ST>
void STACK <ST>::Menu(ST v)
{
    char key;
    do
    {
        cout<< " Выберите действие со стеком: \n";
        cout<< " 1. Помещение элемента в стек\n";
        cout<< " 2. Извлечение элемента из стека\n";
        cout<< " 3. Распечатка содержимого стека\n";
        cout<< " 4. Очищение стека\n";
        cout<< " 5. Выход\n";       
        key = getch();
        switch (key)
        {
        case '1':
            K++;
            cout<< "\n Введите новый элемент: ";
            in>> v;         
            Push(v);    
            system("cls");
            break;
        case '2':
            if (Pop())
            {
                cout<< "\n Значение: " << v << endl << " Элемент удален. Нажмите любую кнопку.";
                K--;
            }
            else
                cout<< "\n Стек пуст.\n";
            getch();
            system("cls");
            break;
        case '3':
            OutPut();
            getch();
            system("cls");
            break;
        case '4':
            Clear();
            K=0;
            system("cls");
            break;
        }
    }while (key!='5');
}
 
void main()
{
    setlocale(LC_ALL,"Russian");    
    char key;
    cout<< " Выберите тип данных: \n";
    cout<< " 1. целочисленный\n";
    cout<< " 2. символьный\n";
    cout<< " 3. комплексные числа\n";
    cout<< " 4. класс CooperBy\n";
    key = getch();
 
    system("cls");
    STACK <int> intStack; 
    STACK <char> charStack; 
    STACK <Complex> compStack;
    STACK <CooperBy> cStack; 
 
    switch (key)
    {
    case '1': 
        cout<< " *** Стек - целочисленный ***\n";
        int v; 
        intStack.Menu(v);
        break;
    case '2': 
        cout<< " *** Стек - символьный ***\n";
        char c;
        charStack.Menu(c);
        break;
    case '3': 
        cout<< " *** Стек - комплексные числа ***\n";
        TComplex xy();
        compStack.Menu(xy);
        break;
    case '4': 
        cout<< " *** Стек - другой класс ***\n";
        CooperBy b("iii", 5, 500);
        cStack.Menu(b);
        break;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2012, 19:52     Как исправить ошибку с перегруженным оператором
Посмотрите здесь:

как исправить ошибку C++
Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? C++
Как исправить ошибку? C++
Как работает ссылка с объектами, классами и перегруженным оператором [] C++
C++ Исправить простой код с оператором cout
Как исправить ошибку C++
C++ Указатель на объект с перегруженным оператором вывода(с наследованием)
Как исправить ошибку? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.06.2012, 21:22     Как исправить ошибку с перегруженным оператором #2
неверные функции ввода вывода. конфликтуют с глобальным оператором вывода. + реализация рекурсивная. тоже ничего хорошего.
вот специализировать нужно как-то так:
C++
1
2
3
4
5
6
7
8
template <class ST>
ostream& operator<<(ostream &out, const STACK<ST>& s)
{
  out << s ; // вот это рекурсивный вызов этого же самого оператора.
                // чтобы был нормальный вывод, тут нужно пройтись по всем элементам стека
                // и распечатать каждый.
  return out;
}
У оператора >> те же самые проблемы.
klukvennya
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 6
06.06.2012, 22:38  [ТС]     Как исправить ошибку с перегруженным оператором #3
это я понимаю)
теперь проблемы такого рода...:
ссылается на case '1'
C++
1
2
3
4
5
6
7
case '1':
            K++;
            cout<< "\n Введите новый элемент: ";
            in >> v;            
            Push(v);    
            system("cls");
            break;
error C2065: in: необъявленный идентификатор

ссылается на case '2'
C++
1
2
3
4
5
6
7
8
9
10
11
case '2':
            if (Pop())
            {
                cout << "\n Значение: "; out << v; cout << "\n Элемент удален. Нажмите любую кнопку.";
                K--;
            }
            else
                cout<< "\n Стек пуст.\n";
            getch();
            system("cls");
            break;
error C2065: out: необъявленный идентификатор
error C2451: недопустимое условное выражение типа 'CooperBy'
error C2451: недопустимое условное выражение типа 'TComplex'

Добавлено через 41 минуту
помогите пожалуйста!
Yandex
Объявления
06.06.2012, 22:38     Как исправить ошибку с перегруженным оператором
Ответ Создать тему
Опции темы

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