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

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

Войти
Регистрация
Восстановить пароль
 
 
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
#1

Специализация операции шаблона - C++

29.11.2013, 15:38. Просмотров 856. Ответов 30
Метки нет (Все метки)

Доброго времени суток.

Имеется шаблон:

C++
1
2
3
4
5
6
7
template<class Type>class Figures
{
    /*...*/
    public:
        /*...*/
        void save();
};
Пытаюсь специализировать функцию save() для типа Square*

C++
1
2
3
4
5
6
7
8
9
void Figures<Square*>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","a");
    /*вывод в файл*/
    fclose(fout);
}
Но получаю ошибку "Ошибка 16 error C2065: FILE: необъявленный идентификатор"
Stdio.h подключен.

Может я не правильно специализирую? Т.к. я не описываю template<class Type>void Figures<Type>::save(), а только специализированный для Square*.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 15:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Специализация операции шаблона (C++):

специализация шаблона - C++
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так. ...

Специализация шаблона - C++
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое...

Специализация шаблона - C++
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; class Tree{ struct TreeItem{ // элемент дерева ...

Специализация шаблона - C++
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор: 1&gt;TemplateArr.obj : error LNK2005:...

Специализация шаблона функции - C++
Как сделать специализированную функцию шаблон на тип int? У меня что-то не получается ..

Явная специализация шаблона - C++
Столкнулся с проблемой при изучении шаблонов. Задача: написать шаблонную функцию, которая принимает в качестве аргумента массив...

30
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.11.2013, 15:50 #2
Quadra, Специализации шаблона... Классы... FILE*? WAT? Чем fstream то не нравится?
ЗЫ файл называется stdio.h, не говоря уже о том что в С++ стоит юзать cstdio
0
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
29.11.2013, 16:18  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Quadra, Специализации шаблона... Классы... FILE*? WAT? Чем fstream то не нравится?
ЗЫ файл называется stdio.h, не говоря уже о том что в С++ стоит юзать cstdio
Файл так и назван, привычка писать заглавную букву.

Возможно я не так выразился, у меня есть шаблон контейнера, который должен подстраиваться под 3 типа данных, Square один из них. В зависимости от этих типов меняется и тип самого контейнера, а в файл выводятся немного разные данные. Мне нужно переопределить шаблон под эти три заданные типа.

Также мне интересно, почему в такой реализации тип FILE не воспринимается шаблоном.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 16:45 #4
Среда какая?
0
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
29.11.2013, 16:50  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая?
VS08
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 16:54 #6
Сделан #include <cstdio> и всё равно ошибка?
0
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
29.11.2013, 16:55  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Сделан #include <cstdio> и всё равно ошибка?
Так точно.

Если функцию описываю так

C++
1
2
3
4
5
6
7
8
template <class Type>void Figures<Type>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","w");
    /*вывод в файл*/
    fclose(fout);
То все компилится. Проблема где-то в переопределении.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:01 #8
...
0
Миниатюры
Специализация операции шаблона  
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
29.11.2013, 17:01 #9
C++
1
2
3
4
5
template <>
void Figures<Square*>::save()
{
    //...
}
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:05 #10
Цитата Сообщение от Quadra Посмотреть сообщение
Если функцию описываю так
Цитата Сообщение от Quadra Посмотреть сообщение
То все компилится. Проблема где-то в переопределении.
При чём здесь тогда FILE ?
0
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
29.11.2013, 17:07  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
...
...

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
template <>
void Figures<Square*>::save()
{
    //...
}
Пробовал, не проходит. То же самое.
0
Миниатюры
Специализация операции шаблона   Специализация операции шаблона  
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
29.11.2013, 17:08  [ТС] #12
del
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
29.11.2013, 17:11 #13
Цитата Сообщение от Quadra Посмотреть сообщение
Пробовал, не проходит. То же самое.
код давайте нормальный, полный, а не куски, потому что куски компилятся.
А еще лучше минимизируйте код так, чтобы была только таже самая проблема
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:15 #14
Quadra, инклудов на скринах не видно.
0
Quadra
8 / 8 / 0
Регистрация: 29.04.2013
Сообщений: 110
29.11.2013, 17:19  [ТС] #15
Цитата Сообщение от Croessmah Посмотреть сообщение
код давайте нормальный, полный, а не куски, потому что куски компилятся
Окей.

Кликните здесь для просмотра всего текста

Classes.h
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#ifndef Classes_H
#define Classes_H
#include <windows.h>
#include <windowsx.h>
 
struct point{int x;int y;};
 
template<class Type>class Figures;
 
class Shape                                     //Фигура.
{
    protected:
        point A,B,A1,B1;
        void checkscreen(point B, RECT rt);     //Фигура умещается в окно?
        void checksquare(point A, point B);     //Фигура - квадрат?
        void checkin();                         //Второй квадрат внутри первого?
    public:
        int type;
        void clearscreen(HWND hwnd, HDC hdc);   //Очистка экрана.
 
        virtual void set_Coord()=0;             //Ввод координат.
        virtual void get_Coord()=0;             //Вывод координат на экран.
        virtual void load_Coord()=0;            //Загрузка координат из файла.
        virtual void save_Coord()=0;            //Сохранение кординат в файл.
 
        virtual void set_Sett()=0;              //Ввод настроек пера и кисти.
        virtual void get_Sett()=0;              //Вывод настроек пера и кисти на экран.
        virtual void load_Sett()=0;             //Загрузка настроек пера и кисти из файла.
        virtual void save_Sett()=0;             //Сохранение настроек пера и кисти в файл.
 
        virtual void shift(int a, int delta)=0; //Сдвиг фигуры.
 
        virtual void DRAW(HWND hwnd,HDC hdc)=0; //Функция рисования.
 
    template <class> friend class Figures;
};
 
struct color{int Red;int Green;int Blue;};
 
class Square:public Shape                       //Квадрат.
{
    protected:
        HPEN OldPen,UserPen;
        char PenStyle[12];
        int Pensize;
        color PenColor;
    public:
        void set_Coord();
        void get_Coord();
        void load_Coord();
        void save_Coord();
 
        void set_Sett();
        void get_Sett();
        void load_Sett();
        void save_Sett();
 
        void shift(int a, int delta);
 
        void DRAW(HWND hwnd,HDC hdc);
 
    template <class> friend class Figures;
};
 
class Filled                                    //Закрашенная фигура.
{
    protected:
        HBRUSH OldBrush,UserBrush,BlackBrush;
        char BrushStyle[12];
        color BrushColor;
 
};
 
class FilledSquare:public Square,public Filled  //Закрашенный квадрат.
{
    public:
        void set_Sett();
        void get_Sett();
        void load_Sett();
        void save_Sett();
 
        void DRAW(HWND hwnd,HDC hdc);
 
    template <class> friend class Figures;
};
 
class CombiSquare:public FilledSquare           //Квадрат в квадрате.
{
    protected:
        FilledSquare FS;
    public:
        void set_Coord();
        void get_Coord();
        void load_Coord();
        void save_Coord();
 
        void shift(int a, int delta);
 
        void DRAW(HWND hwnd, HDC hdc);
 
    template <class> friend class Figures;
};
 
template<class Type>class Figures
{
    private:
        int place;                                                              //Последняя свободная позиция таблицы.
        int size;                                                               //Размер таблицы.
        struct elem{Type data;int ID;} *M;
    public:
        Figures(int N);
        ~Figures();
        int get_size();
        int get_place();
        int search(int key, int *j);
        int add(Type elem, int ID);
        Type get(int i);
        int del(int key);
        void save();
};
 
template<class Type>Figures<Type>::Figures(int N){size=N;M=new elem[size];place=0;}
template<class Type>Figures<Type>::~Figures() {delete []M;}
template<class Type>int Figures<Type>::get_size() {return size;}
template<class Type>int Figures<Type>::get_place() {return place;}
template<class Type>int Figures<Type>::search(int key, int *j) 
{
    int i,R=0;
 
    for (i=0;((i<place)&&(R==0));i++)
        if (M[i].ID==key) R=1;
    i--;
    *j=i;
 
    return R;
}
template<class Type>int Figures<Type>::add(const Type elem, int ID) 
{
    int t;
 
    if (search(ID,&t)==0)
    {
        if (place<size)
        {
            M[place].data=elem;
            M[place].ID=ID;
            place++;
            return 1;
        }
        else return 0;
    }
    else return 0;
}
template<class Type>Type Figures<Type>::get(int i) 
{
    return M[i].data;
}
template<class Type>int Figures<Type>::del(int key)
{
    int i;
 
    if (search(key,&i)==1)
    {
        for (;i<place-1;i++) M[i]=M[i+1];
        place--;
        return 1;
    }
    else return 0;  
}
void Figures<Square>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","w");
    for (i=0;i<place;i++)
    {
        fprintf(fout,"ID фигуры: %d\n",M[i].ID);
        fprintf(fout,"Координаты: %d %d %d %d\n",M[i].data.A,M[i].data.B);
        fprintf(fout,"Стиль пера: %s Размер: %d Цвет: RGB(%d,%d,%d)\n",M[i].data.PenStyle,M[i].data.Pensize,M[i].data.PenColor.Red,M[i].data.PenColor.Green,M[i].data.PenColor.Blue);
        fprintf(fout,"\n\n\n");
    }
    fclose(fout);
}
 
void commandlist(int a);                        //Списки команд.
 
#endif
Main.cpp
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#include <windows.h>  
#include <windowsx.h>  
#include <conio.h>
#include <cstdio>
#include <math.h>
#include <locale.h>
#include "Classes.h"
 
void main()
{
    setlocale(LC_CTYPE,"Russian");
    HWND hwnd=GetConsoleWindow();
    HDC hdc=GetDC(hwnd);
    int COMMAND=-1,delta,key,pos,numb;
    Shape *pS;
    Square S;
    FilledSquare FS;
    CombiSquare CS;
    FILE *FOUT;
 
    FOUT=fopen("Squares.txt","w");
    fclose(FOUT);
    FOUT=fopen("FilledSquares.txt","w");
    fclose(FOUT);
    FOUT=fopen("CombiSquares.txt","w");
    fclose(FOUT);
 
    printf("Введите количество фигур-контуров: ");
    scanf("%d",&numb);
    Figures<Square> STable(numb);
    printf("Введите количество закрашенных фигур: ");
    scanf("%d",&numb);
    Figures<FilledSquare> FSTable(numb);
    printf("Введите количество комбинированных фигур: ");
    scanf("%d",&numb);
    Figures<CombiSquare> CSTable(numb);
 
    system("cls");
 
    MoveWindow(hwnd,0,0,1000,780,TRUE);
 
    commandlist(1);
 
    while (COMMAND!=4)
    {
        printf("Введите команду: ");
        scanf("%d",&COMMAND);
        
        if (COMMAND==0) commandlist(1);
        else
            if (COMMAND==1)
            {
                pS=&S;
                pS->type=1;
            }                   
            else
                if (COMMAND==2)
                {
                    pS=&FS;
                    pS->type=2;
                }
                else
                    if (COMMAND==3)
                    {
                        pS=&CS;
                        pS->type=3;
                    }
                    else
                        if (COMMAND!=4) printf("Неверная команда!\n");
        if ((COMMAND==1)||(COMMAND==2)||(COMMAND==3))
        {           
            while (COMMAND!=9)
            {
                COMMAND=-1;
                system("cls");
                commandlist(2);
                
                printf("Введите команду: ");
                scanf("%d",&COMMAND);
                if (COMMAND==0) commandlist(2);
                else
                    if (COMMAND==1)
                    {
                        pS->load_Coord();
                        pS->load_Sett();
                    }
                    else
                        if (COMMAND==2)
                        {
                            pS->DRAW(hwnd,hdc);
                        }
                        else
                            if (COMMAND==3)
                            {
                                pS->clearscreen(hwnd,hdc);
                            }
                            else
                                if (COMMAND==4)
                                {
                                    COMMAND=-1;
                                    while (COMMAND!=5)
                                    {
                                        system("cls");
                                        commandlist(3);
                                        printf("Введите команду: ");
                                        scanf("%d",&COMMAND);
 
                                        if (COMMAND==0) commandlist(3);
                                        else
                                            if (COMMAND==1)
                                            {
                                                printf("Введите смещение: ");
                                                scanf("%d",&delta);
                                                pS->shift(1,delta);
                                                pS->clearscreen(hwnd,hdc);
                                                pS->DRAW(hwnd,hdc);
                                            }
                                            else
                                                if (COMMAND==2)
                                                {
                                                    printf("Введите смещение: ");
                                                    scanf("%d",&delta);
                                                    pS->shift(2,delta);
                                                    pS->clearscreen(hwnd,hdc);
                                                    pS->DRAW(hwnd,hdc);
                                                }
                                                else
                                                    if (COMMAND==3)
                                                    {
                                                        printf("Введите смещение: ");
                                                        scanf("%d",&delta);
                                                        pS->shift(3,delta);
                                                        pS->clearscreen(hwnd,hdc);
                                                        pS->DRAW(hwnd,hdc);
                                                    }
                                                    else
                                                        if (COMMAND==4)
                                                        {
                                                            printf("Введите смещение: ");
                                                            scanf("%d",&delta);
                                                            pS->shift(4,delta);
                                                            pS->clearscreen(hwnd,hdc);
                                                            pS->DRAW(hwnd,hdc);
                                                        }
                                                        else
                                                            if (COMMAND!=5) printf("Неверная команда!\n");
                                    }
                                    COMMAND=-1;
                                    system("cls");
                                    commandlist(2);
                                }
                                else
                                    if (COMMAND==5)
                                    {
                                        printf("Введите ключ: ");
                                        scanf("%d",&key);
                                        if (pS->type==1) STable.add(S,key);
                                        else
                                            if (pS->type==2) FSTable.add(FS,key);
                                            else
                                                if (pS->type==3) CSTable.add(CS,key);
                                    }
                                    else
                                        if (COMMAND==6)
                                        {
                                            printf("Введите ключ: ");
                                            scanf("%d",&key);
                                            if (pS->type==1) 
                                            {
                                                if (STable.search(key,&pos)==1)
                                                {
                                                    pS=&STable.get(pos);
                                                    pS->DRAW(hwnd,hdc);
                                                }
                                            }
                                            else
                                                if (pS->type==2) 
                                                {
                                                    if (FSTable.search(key,&pos)==1)
                                                    {
                                                        pS=&FSTable.get(pos);
                                                        pS->DRAW(hwnd,hdc);
                                                    }
                                                }
                                                else
                                                    if (pS->type==3) 
                                                    {
                                                        if (CSTable.search(key,&pos)==1)
                                                        {
                                                            pS=&CSTable.get(pos);
                                                            pS->DRAW(hwnd,hdc);
                                                        }
                                                    }
                                        }
                                        else
                                            if (COMMAND==7)
                                            {
                                                printf("Введите ключ: ");
                                                scanf("%d",&key);
                                                if (pS->type==1) STable.del(key);
                                                else
                                                    if (pS->type==2) FSTable.del(key);
                                                    else
                                                        if (pS->type==3) CSTable.del(key);
                                            }
                                            else
                                                if (COMMAND==8)
                                                {
                                                    if (pS->type==1) 
                                                    {
                                                        STable.save();
                                                    }
                                                    else
                                                        if (pS->type==2) 
                                                        {
                                                            FSTable.save();
                                                        }
                                                        else
                                                            if (pS->type==3) 
                                                            {
                                                                CSTable.save();
                                                            }
                                                }
                                                else
                                                    if (COMMAND!=9) printf("Неверная команда!\n");
            }
            COMMAND=-1;
            system("cls");
            commandlist(1);
        }
    }
    ReleaseDC(hwnd,hdc);
}
0
29.11.2013, 17:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2013, 17:19
Привет! Вот еще темы с ответами:

Явная специализация шаблона - C++
Здравствуйте, подскажите, пожалуйста, почему не выполняется неявное приведение фактических параметров к формальным при вызове функции для...

Частичная специализация шаблона - C++
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include &lt;iostream&gt; using...

Специализация шаблона класса - C++
Имеется задание: Создать свой шаблонный класс – динамический массив (myvector). Создать методы этого класса. Инстанцировать для своего...

Явная специализация шаблона - C++
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename T&gt; void func(T &amp;blue, T &amp;red); ...


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

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

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