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

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

Восстановить пароль Регистрация
 
 
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 15:38     Специализация операции шаблона #1
Доброго времени суток.

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

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*.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 15:38     Специализация операции шаблона
Посмотрите здесь:

Частичная специализация шаблона C++
C++ Специализация шаблона
C++ Специализация шаблона класса
C++ специализация шаблона функции
C++ специализация шаблона
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2013, 15:50     Специализация операции шаблона #2
Quadra, Специализации шаблона... Классы... FILE*? WAT? Чем fstream то не нравится?
ЗЫ файл называется stdio.h, не говоря уже о том что в С++ стоит юзать cstdio
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 16:18  [ТС]     Специализация операции шаблона #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Quadra, Специализации шаблона... Классы... FILE*? WAT? Чем fstream то не нравится?
ЗЫ файл называется stdio.h, не говоря уже о том что в С++ стоит юзать cstdio
Файл так и назван, привычка писать заглавную букву.

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

Также мне интересно, почему в такой реализации тип FILE не воспринимается шаблоном.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 16:45     Специализация операции шаблона #4
Среда какая?
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 16:50  [ТС]     Специализация операции шаблона #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая?
VS08
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 16:54     Специализация операции шаблона #6
Сделан #include <cstdio> и всё равно ошибка?
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
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);
То все компилится. Проблема где-то в переопределении.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:01     Специализация операции шаблона #8
...
Миниатюры
Специализация операции шаблона  
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
29.11.2013, 17:01     Специализация операции шаблона #9
C++
1
2
3
4
5
template <>
void Figures<Square*>::save()
{
    //...
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:05     Специализация операции шаблона #10
Цитата Сообщение от Quadra Посмотреть сообщение
Если функцию описываю так
Цитата Сообщение от Quadra Посмотреть сообщение
То все компилится. Проблема где-то в переопределении.
При чём здесь тогда FILE ?
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 17:07  [ТС]     Специализация операции шаблона #11
Цитата Сообщение от alsav22 Посмотреть сообщение
...
...

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
template <>
void Figures<Square*>::save()
{
    //...
}
Пробовал, не проходит. То же самое.
Миниатюры
Специализация операции шаблона   Специализация операции шаблона  
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 17:08  [ТС]     Специализация операции шаблона #12
del
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
29.11.2013, 17:11     Специализация операции шаблона #13
Цитата Сообщение от Quadra Посмотреть сообщение
Пробовал, не проходит. То же самое.
код давайте нормальный, полный, а не куски, потому что куски компилятся.
А еще лучше минимизируйте код так, чтобы была только таже самая проблема
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:15     Специализация операции шаблона #14
Quadra, инклудов на скринах не видно.
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
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);
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:22     Специализация операции шаблона #16
Цитата Сообщение от Quadra Посмотреть сообщение
Окей.
И где там, в .h файле, #include <cstdio>?
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 17:26  [ТС]     Специализация операции шаблона #17
Цитата Сообщение от alsav22 Посмотреть сообщение
И где там, в .h файле, #include <cstdio>?
Он в майне. В такой связке никогда проблем не было. Если перенести в .h злится линкер, как раз на эту функцию.

Ошибка 47 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class CombiSquare>::save(void)" (?save@?$Figures@VCombiSquare@@@@QAEXXZ) в функции _main Main.obj

Ошибка 48 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class FilledSquare>::save(void)" (?save@?$Figures@VFilledSquare@@@@QAEXXZ) в функции _main Main.obj

Ошибка 49 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class Square>::save(void)" (?save@?$Figures@VSquare@@@@QAEXXZ) в функции _main Main.obj
При конструкции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class Type>void Figures<Type>::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);
}
независимо от положения строки <cstdio> между файлами код компилится. Но эта функция будет вызываться при любом Type. Мне же нужно чтобы именно эта реализация реагировала именно на Square.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:27     Специализация операции шаблона #18
Цитата Сообщение от Quadra Посмотреть сообщение
Он в майне.
И что? Как это должно влиять на .h файл?
Quadra
5 / 5 / 0
Регистрация: 29.04.2013
Сообщений: 99
29.11.2013, 17:31  [ТС]     Специализация операции шаблона #19
Цитата Сообщение от alsav22 Посмотреть сообщение
И что? Как это должно влиять на .h файл?
Всегда так делал, никогда такой ошибки не возникало. Почему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2013, 17:40     Специализация операции шаблона
Еще ссылки по теме:

Специализация шаблона C++
Явная специализация шаблона C++
C++ Специализация шаблона

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
29.11.2013, 17:40     Специализация операции шаблона #20
Цитата Сообщение от Quadra Посмотреть сообщение
Но эта функция будет вызываться при любом Type. Мне же нужно чтобы именно эта реализация реагировала именно на Square.
Если тип будет Square, то будет использована специализация, а для других типов будет использоваться общая функция.
В данном случае у Вас есть специализация для Square, но нет реализации функции для других типов:
Цитата Сообщение от Quadra Посмотреть сообщение
Ошибка 47 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class CombiSquare>::save(void)" (?save@?$Figures@VCombiSquare@@@@QAEXXZ) в функции _main Main.obj
Ошибка 48 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class FilledSquare>::save(void)" (?save@?$Figures@VFilledSquare@@@@QAEXXZ) в функции _main Main.obj
Добавлено через 5 минут
У Вас в коде вообще отсутствуют реализации целой тучи функций
Yandex
Объявления
29.11.2013, 17:40     Специализация операции шаблона
Ответ Создать тему
Опции темы

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