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

Шаблон - C++

Восстановить пароль Регистрация
 
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 11:41     Шаблон #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
#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 &"
}
Ну и во сторой функции тоже самое. Помогите плиз)))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2010, 11:41     Шаблон
Посмотрите здесь:

C++ Шаблон
C++ шаблон
Шаблон C++
C++ Шаблон класса
C++ вектор,шаблон
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2010, 12:02     Шаблон #2
Цитата Сообщение от robert19 Посмотреть сообщение
C++
1
//error C2440: return: невозможно преобразовать "List<T>" в "int &"
Более, чем странно, так как this имеет тип указателя на T, а по твоей декларации ожидается ссылка на Т.
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 12:07  [ТС]     Шаблон #3
как исправить? Вот не знаю как переменную "а" сделать типом "Т". Тогда думаю было бы все тип-топ
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2010, 12:11     Шаблон #4
Цитата Сообщение от robert19 Посмотреть сообщение
Но не могу сделать так что бы переменная "а" принимала тот же тип, что и шаблон.
Что это значит?
robert19
25 / 25 / 3
Регистрация: 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 секунд
может я просто не очень понятно объясняю. незнаю даже как сказать то подробнее
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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;
.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.11.2010, 12:56     Шаблон #7
Цитата Сообщение от robert19 Посмотреть сообщение
Т = char
И вот как сделать что бы 'а' тоже автоматом была равная 'Т'
Можно сделать отдельную ф-цию, которая будет создавать 2 указателя (один на List<T>, второй на тип Т), динамически выделять "под них" память и возвращать эти указатели. Таким образом можно добится того, "что бы 'а' тоже автоматом была равная 'Т'"
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:16     Шаблон #9
Опиши подробнее, как ты хочешь, чтобы работали операторы "<<" и ">>". Не совсем понятно, чего ты добиваешься.
Kastaneda
15.11.2010, 13:31
  #10

Не по теме:

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

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

robert19
25 / 25 / 3
Регистрация: 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);
.
Что то все равно ошибки(((
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:54     Шаблон #12
robert19, а что эти операторы возвращают? Ссылку на новый список?
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 13:55  [ТС]     Шаблон #13
Цитата Сообщение от volovzi Посмотреть сообщение
robert19, а что эти операторы возвращают? Ссылку на новый список?
Почему на новый то
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:58     Шаблон #14
Что эти операторы возвращают?

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

Добавлено через 27 секунд
Поправка: что должны возвращать?
возвращает ссылку на объект
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2010, 14:06     Шаблон
Еще ссылки по теме:

Шаблон C++
C++ Шаблон
C++ Меню(Шаблон)

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

Или воспользуйтесь поиском по форуму:
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 14:06     Шаблон #16
На какой объект?
Yandex
Объявления
15.11.2010, 14:06     Шаблон
Ответ Создать тему
Опции темы

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