Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
27 / 27 / 7
Регистрация: 26.03.2010
Сообщений: 305
1

Шаблон

15.11.2010, 11:41. Просмотров 879. Ответов 15
Метки нет (Все метки)

Всем доброе время суток))
Вот нпаисал прогу:
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
#include <string.h>
#include <iostream>
using namespace std;
 
template<class T>
class List{
private:
        struct Element{
                T key;
                Element *next;
        };
        Element* pbeg;
        Element* pend;
public:
        List(){
                pbeg = 0;
                pend = 0;
        }
        T& operator <<(int a);
        T& operator >>(int& a);
        void print();
        ~List(){
            while(pbeg){
                Element* temp = pbeg;
                pbeg = pbeg->next;
                delete temp;
                temp = 0; 
            }
        }
};
 
template<class T>T& List<T>::operator << (int a){
    Element* ph = new Element;
    ph->key = a;
    ph->next = 0;
    if (pend!=0){
        pend->next = ph;
        pend = ph;
    }
    else{
        pbeg = ph;
        pend = ph;
    }
    return *this;
}
template<class T>T& List<T>::operator>>(int &a){
    if(pbeg){
        a = pbeg->key;
        Element* ph = pbeg;
        pbeg = pbeg->next;
        delete ph;
        return *this;
    }
    else{
        throw "Нет элементов!\n";
    }
}
template<class T>void List<T>::print(){
    Element* temp = pbeg;
    while(temp){
        cout << " " << temp->key;
        temp = temp->next;
    }
    cout << endl;
}
int main(){
    setlocale(LC_ALL,"Russian");
    List<int> w; int b=0;int a;
    while(true){
        cout<<"1) Заполнить очередь"<<endl;
        cout<<"2) Вывести на экран"<<endl;
        cout<<"3) Удалить элемент"<<endl;
        cout<<"0) Выход"<<endl;
        cout<<"Ввод: "; cin>>b;
        if (b == 1){
            system("cls");
            cout<<"Введите значение: ";
            cin>>a;
            w<<a;
        }
        if (b == 2){
            system("cls");
            cout<<"Список: ";
            w.print();
            cout<<endl;
        }
        if (b == 3){
            try{
                system("cls");
                w>>a;
            }
            catch(char error){
                cout<<error<<endl;
            }
        }
        if (b == 0)break;
    }
}
Но не могу сделать так что бы переменная "а" принимала тот же тип, что и шаблон. И еще выдает ошибку когда пытаюсь сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>T& List<T>::operator << (int a){
    Element* ph = new Element;
    ph->key = a;
    ph->next = 0;
    if (pend!=0){
        pend->next = ph;
        pend = ph;
    }
    else{
        pbeg = ph;
        pend = ph;
    }
    return *this;//error C2440: return: невозможно преобразовать "List<T>" в "int &"
}
Ну и во сторой функции тоже самое. Помогите плиз)))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2010, 11:41
Ответы с готовыми решениями:

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают)...

Передать шаблон std::array в другой шаблон
Шаблон std::vector передать получается: template &lt;class T, template&lt;class U, class = allocator&lt;U&gt;...

Шаблон стека изменить на шаблон очереди
Кто может пояснить как работает этот шаблон стека, так как мне нужно изменить его на очередь,а я не...

"LinkedList": для использования класс шаблон требуется список аргументов шаблон
Что то не могу въехать в чем промах? LinkedList.h #pragma once #include &lt;iostream&gt; #include...

15
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
15.11.2010, 12:02 2
Цитата Сообщение от robert19 Посмотреть сообщение
C++
1
//error C2440: return: невозможно преобразовать "List<T>" в "int &"
Более, чем странно, так как this имеет тип указателя на T, а по твоей декларации ожидается ссылка на Т.
0
27 / 27 / 7
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 12:07  [ТС] 3
как исправить? Вот не знаю как переменную "а" сделать типом "Т". Тогда думаю было бы все тип-топ
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
15.11.2010, 12:11 4
Цитата Сообщение от robert19 Посмотреть сообщение
Но не могу сделать так что бы переменная "а" принимала тот же тип, что и шаблон.
Что это значит?
0
27 / 27 / 7
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 12:30  [ТС] 5
Ну что бы мне добавить элемент в очередь или же от туда удалить я завожу переменную "а", но она типа int а мне нужно что бы она автоматом принимала тот тип которым будет объект.
например я завел:
C++
1
 List<int> w; int a;
Теперь Т = int
А если
C++
1
 List<char> w;int a;
Т = char
И вот как сделать что бы 'а' тоже автоматом была равная 'Т'

Добавлено через 27 секунд
может я просто не очень понятно объясняю. незнаю даже как сказать то подробнее
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
15.11.2010, 12:35 6
Сам уже глючу, this указывает не на T, а на List. А ожидается ссылка на T. Но звёздочкой ты преобразуешь указатель в ссылку, не меняя типа. Поменяй декларацию на
C++
1
List<T> & operator << (<T> a);
.

Добавлено через 1 минуту
Цитата Сообщение от robert19 Посмотреть сообщение
Т = char
И вот как сделать что бы 'а' тоже автоматом была равная 'Т'
Комп не способен догадаться о какой либо связи между w и a. Поэтому если хочешь, чтоб a имела базовый тип, то пиши явно:
C++
1
List<char>w; char a;
.
0
Jesus loves me
Эксперт С++
5110 / 3122 / 353
Регистрация: 12.12.2009
Сообщений: 7,899
Записей в блоге: 2
15.11.2010, 12:56 7
Цитата Сообщение от robert19 Посмотреть сообщение
Т = char
И вот как сделать что бы 'а' тоже автоматом была равная 'Т'
Можно сделать отдельную ф-цию, которая будет создавать 2 указателя (один на List<T>, второй на тип Т), динамически выделять "под них" память и возвращать эти указатели. Таким образом можно добится того, "что бы 'а' тоже автоматом была равная 'Т'"
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
15.11.2010, 13:14 8
Бред. Функции работают в runtime, а типы переменных задаются в deisgnedtime. Кроме того, ни одна функция, кроме возвращающих runtime информацию о типе (в том числе, о расходе на него памяти (suizeof)), не примет тип в качестве параметра.

Добавлено через 4 минуты
Вы когда массивы объявляете и вам нужны переменные базовых типов этих массивов (например, буфер для обмена двух элементов местами имеет базовый тип массива, то есть тип элемента) тоже пытаетесь сделать автомат, обеспечивающий совпадение типов? Уж если надо перетипизировать конейнерные типы, а перетипизировать одновременно буфера базовых типов лень, то под каждый вариант базового типа создавайте или макрос, или синонимичный тип.

Добавлено через 1 минуту
C++
1
2
3
#define TIten int
List <TItem>w;
TItem a;
. Здесь хоть как меняй int на char, потом на double, тип a будет оставаться совпадающим с базовым типом w.
1
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:16 9
Опиши подробнее, как ты хочешь, чтобы работали операторы "<<" и ">>". Не совсем понятно, чего ты добиваешься.
0
Kastaneda
15.11.2010, 13:31
  #10

Не по теме:

Бред. Функции работают в runtime, а типы переменных задаются в deisgnedtime. Кроме того, ни одна функция, кроме возвращающих runtime информацию о типе (в том числе, о расходе на него памяти (suizeof)), не примет тип в качестве параметра.
Да, согласен. Что-то я перекодил %-)

P.S. Вчера поздно вечером минут 30 не мог понять почему sizeof не правильно возвращает длину строки О_о

0
27 / 27 / 7
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 13:48  [ТС] 11
Цитата Сообщение от volovzi Посмотреть сообщение
Опиши подробнее, как ты хочешь, чтобы работали операторы "<<" и ">>". Не совсем понятно, чего ты добиваешься.
хочу добиться того, что бы:
я содал объект List<int> w; int a;
Теперь с помощью перегруженной операции '<<' мне нужно добавить элемент в очередь. Я ввожу 3 и он его добавляет и т.д.
Но если я создам объект List<char> w; то и переменную 'a' мне тоже придется менять тип на char. дак вот что бы так каждый раз не менять, я и хотел бы как нить сделать, что бы переменная принимала тот тип как у объекта 'w'.
т.е. если
C++
1
2
List<double> w; то и double a;
List<float> w; то и float a;
Добавлено через 14 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Сам уже глючу, this указывает не на T, а на List. А ожидается ссылка на T. Но звёздочкой ты преобразуешь указатель в ссылку, не меняя типа. Поменяй декларацию на
C++
1
List<T> & operator << (<T> a);
.
Что то все равно ошибки(((
0
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:54 12
robert19, а что эти операторы возвращают? Ссылку на новый список?
0
27 / 27 / 7
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 13:55  [ТС] 13
Цитата Сообщение от volovzi Посмотреть сообщение
robert19, а что эти операторы возвращают? Ссылку на новый список?
Почему на новый то
0
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:58 14
Что эти операторы возвращают?

Добавлено через 27 секунд
Поправка: что должны возвращать?
0
27 / 27 / 7
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 14:01  [ТС] 15
Цитата Сообщение от volovzi Посмотреть сообщение
Что эти операторы возвращают?

Добавлено через 27 секунд
Поправка: что должны возвращать?
возвращает ссылку на объект
0
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 14:06 16
На какой объект?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2010, 14:06

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

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список)....

Шаблон родительского класса и шаблон класса потомка
Запутался, как правильно пронаследоваться от шаблона класса? #include &lt;iostream&gt; #include...

Шаблон
Создать класс-шаблон, содержащий поля для хранения одномерного массива и количества элементов в...

Шаблон
Доброго времени суток. Есть две функции: void mouseMove( int x, int y, int speed = 1, int...

шаблон
подскажите, пожалуйста, как на языке СИ сравнить слово с шаблоном ? то есть, например, есть шаблон...

Шаблон
Имеется код: //header #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;valarray&gt; using...


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

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

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