Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
#1

Шаблон - C++

15.11.2010, 11:41. Просмотров 765. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2010, 11:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблон (C++):

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

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

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

Шаблон - C++
Подскажите пожалуйста про шаблон! Создать шаблон класса: двухсвязный список. Добавления элементов int, string;

шаблон - C++
подскажите, пожалуйста, как на языке СИ сравнить слово с шаблоном ? то есть, например, есть шаблон *%#, где * - только цифры, % - только...

Шаблон - C++
Имеется код: //header #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;valarray&gt; using namespace std; template &lt;class T1,...

15
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2010, 12:02 #2
Цитата Сообщение от robert19 Посмотреть сообщение
C++
1
//error C2440: return: невозможно преобразовать "List<T>" в "int &"
Более, чем странно, так как this имеет тип указателя на T, а по твоей декларации ожидается ссылка на Т.
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 12:07  [ТС] #3
как исправить? Вот не знаю как переменную "а" сделать типом "Т". Тогда думаю было бы все тип-топ
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2010, 12:11 #4
Цитата Сообщение от robert19 Посмотреть сообщение
Но не могу сделать так что бы переменная "а" принимала тот же тип, что и шаблон.
Что это значит?
0
robert19
26 / 26 / 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 секунд
может я просто не очень понятно объясняю. незнаю даже как сказать то подробнее
0
taras atavin
3570 / 1753 / 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;
.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
15.11.2010, 12:56 #7
Цитата Сообщение от robert19 Посмотреть сообщение
Т = char
И вот как сделать что бы 'а' тоже автоматом была равная 'Т'
Можно сделать отдельную ф-цию, которая будет создавать 2 указателя (один на List<T>, второй на тип Т), динамически выделять "под них" память и возвращать эти указатели. Таким образом можно добится того, "что бы 'а' тоже автоматом была равная 'Т'"
0
taras atavin
3570 / 1753 / 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.
1
volovzi
267 / 169 / 8
Регистрация: 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
robert19
26 / 26 / 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);
.
Что то все равно ошибки(((
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:54 #12
robert19, а что эти операторы возвращают? Ссылку на новый список?
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
15.11.2010, 13:55  [ТС] #13
Цитата Сообщение от volovzi Посмотреть сообщение
robert19, а что эти операторы возвращают? Ссылку на новый список?
Почему на новый то
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
15.11.2010, 13:58 #14
Что эти операторы возвращают?

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

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

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

Шаблон в классе - C++
Имеем три файла: №1 &quot;51Template.h&quot; #include &lt;iostream&gt; using namespace std; class A { public:

Шаблон классов - C++
Здорова! Не получается никак составить шаблон для классов: struct element; struct Link { element *prev, *next;//informaci9...

c++ шаблон функции - C++
Есть некая структура, которая хранит информацию о фигурах (площадь основания, радиус и т.д.). Нужно описать шаблонную функцию, которая в...


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

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

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