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

Шаблон класса - C++

Восстановить пароль Регистрация
 
BREAK350
1 / 1 / 0
Регистрация: 08.07.2012
Сообщений: 23
15.01.2013, 18:38     Шаблон класса #1
//файл T_Point_template.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
//---------------------------------------------------------------------------
#ifndef T_Point_templateH
#define T_Point_templateH
#include <vcl.h>
#include <math.h>
#include <stdio.h>
//---------------------------------------------------------------------------
template <class Type>
class T_Point
{
    protected:
        Type x,y;
    public:
        T_Point();
        T_Point(Type,Type);
        T_Point(TPoint);
        T_Point(const T_Point &);
        ~T_Point(){}
        bool operator == (T_Point);
        bool operator !=(T_Point);
        operator TPoint();
        T_Point& operator = (const T_Point &);
        T_Point Symetry(T_Point);
        char* toChar(int);
        float Distance(T_Point);
        Type GetX(){return x;}
        Type GetY(){return y;}
        void Draw(TCanvas *,const TColor &);
        void Init(Type,Type);
        void SetX(Type _x){x=_x;}
        void SetY(Type _y){y=_y;}
};
//---------------------------------------------------------------------------
typedef T_Point < float > fT_Point;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif

//T_Point_template.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma hdrstop
#include "T_Point_template.h"
#pragma package(smart_init)
template <class Type>
T_Point< Type >::T_Point(Type _x,Type _y)
{
    x=_x;
    y=_y;
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >::T_Point()
{
    x=y=0;
}
//---------------------------------------------------------------------------
//Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
#include "T_Point_template.h"
#pragma argsused
int main(int argc, char* argv[])
{
    fT_Point t1(5,7);
    T_Point <int> t2;
    return 0;
}
//---------------------------------------------------------------------------
почему выдает ошибку:
[Linker Error] Unresolved external 'T_Point<float>::T_Point<float>(float, float)' referenced from D:\РОЗВАГИ\ПРОГРАМИ С++\МОЯ БІБЛІОТЕКА\T_POINT\НОВАЯ ПАПКА\UNIT1.OBJ
[Linker Error] Unresolved external 'T_Point<int>::T_Point<int>()' referenced from D:\РОЗВАГИ\ПРОГРАМИ С++\МОЯ БІБЛІОТЕКА\T_POINT\НОВАЯ ПАПКА\UNIT1.OBJ
помогите, пожалуста

Добавлено через 5 минут
если нужно, вот полный файл T_Point_template.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
//---------------------------------------------------------------------------
#pragma hdrstop
#include "T_Point_template.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
template <class Type>
float T_Point< Type >::Distance(T_Point p)
{
    return sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >::T_Point(Type _x,Type _y)
{
    x=_x;
    y=_y;
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >::T_Point(TPoint p)
{
    x=p.x;
    y=p.y;
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >::T_Point(const T_Point &p)
{
    x=p.x;
    y=p.y;
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >::operator TPoint()
{
    return TPoint(x,y);
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >& T_Point< Type >::operator = (const T_Point &p)
{
    x=p.x;                             
    y=p.y;
    return *this;
}
//---------------------------------------------------------------------------
template <class Type>
bool T_Point< Type >::operator == (T_Point p)
{
    return (x==p.x && y==p.y);
}
//---------------------------------------------------------------------------
template <class Type>
bool T_Point< Type >::operator != (T_Point p)
{
    return !(*this==p);
}
//---------------------------------------------------------------------------
template <class Type>
void T_Point< Type >::Init(Type _x,Type _y)
{
    x=_x;
    y=_y;
}
//---------------------------------------------------------------------------
template <class Type>
T_Point< Type >::T_Point()
{
    x=y=0;
}
//---------------------------------------------------------------------------
template <class Type>
char* T_Point< Type >::toChar(int n)
{
    if(n<0)
    {
        return NULL;
    }
    char buf[32];
    sprintf(buf,"(%1.2f;%1.2f)",x,y);
    return strdup(buf);
}
//---------------------------------------------------------------------------
template <class Type>
void T_Point< Type >::Draw(TCanvas *Canvas,const TColor &cl)
{
    Canvas->Pixels[x][y]=cl;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2013, 18:38     Шаблон класса
Посмотрите здесь:

C++ Шаблон класса.
Шаблон класса. Ошибка `undefined reference` C++
Шаблон класса C++
Шаблон класса (параметризация класса) C++
C++ Шаблон класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ArmanPrestige
 Аватар для ArmanPrestige
219 / 210 / 50
Регистрация: 15.01.2013
Сообщений: 787
15.01.2013, 18:45     Шаблон класса #2
Методы шаблонного класса должны быть видны в точке инстанцирования.
в *.cpp файле класс виден, но никем не используется, поэтому его методы не создаются.

наиболее простой способ побороть ошибку - оставить реализацию методов в заголовочном файле
BREAK350
1 / 1 / 0
Регистрация: 08.07.2012
Сообщений: 23
15.01.2013, 18:52  [ТС]     Шаблон класса #3
ArmanPrestige,
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
наиболее простой способ
а какии есть еще методы?

тогда получаеться, что файл cpp не нужен?
ArmanPrestige
 Аватар для ArmanPrestige
219 / 210 / 50
Регистрация: 15.01.2013
Сообщений: 787
15.01.2013, 19:02     Шаблон класса #4
Цитата Сообщение от BREAK350 Посмотреть сообщение
ArmanPrestige,

а какии есть еще методы?

тогда получаеться, что файл cpp не нужен?
получается так. однако если вам известно с какими типами будет использоваться данный метод в шаблонном классе, то можно вынести эти специализации.

Добавлено через 3 минуты
вы должны помнить, что шаблон порождает код класса только тогда, когда вы употребляете этот шаблон в программе с конкретными параметрами. это означает, что нельзя скомпилировать модуль содержащий просто шаблон класса. шаблон это еще не тип (если говорить о С++). таким образом, реализация метода должна быть в том модуле, где этот метод используется, иначе получите Unresolved symbol
Yandex
Объявления
15.01.2013, 19:02     Шаблон класса
Ответ Создать тему
Опции темы

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