Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с template / 2 сообщений из 2, страница 1 из 1
27.03.2006, 17:26
    #33627880
matsic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с template
В 6 Билдере в проэкт добавил файлы:

rz.h
Код: plaintext
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.
//---------------------------------------------------------------------------

#ifndef rzH
#define rzH
template <class T>
struct RZ
{
union
  {
   long data32;
   short data16[ 2 ];
   struct
   {
    unsigned Label: 8 ;
    unsigned x: 21 ;
    unsigned SSM: 2 ;
    unsigned Parity: 1 ;
   }f;
   T data;
  }data;
void Send(short);
bool ParityCheck(void);
void SetParity(void);
void SetLabel(int,int,int);
void SetLabel(unsigned);
};
//---------------------------------------------------------------------------
#endif

rz.cpp
Код: plaintext
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.
//---------------------------------------------------------------------------
#include "ports.h"

#pragma hdrstop

#include "rz.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

template <class T>
void RZ<T>::Send(short prt=- 1 )
{
if(prt< 0 )prt=port;
SetParity();
outportX(prt,data16[ 0 ]);
outportX(prt+ 2 ,data16[ 1 ]);
}

template <class T>
bool RZ<T>::ParityCheck(void)
{
 int i,sum= 0 ;
 for(i= 0 ;i< 32 ;i++)
  sum+=(data32>>i)& 1 ;
 return sum& 1 ;
}

template <class T>
void RZ<T>::SetParity(void)
{
if(!ParityCheck())
 data.f.Parity=!data.f.Parity;
}

template <class T>
void RZ<T>::SetLabel(int a,int b,int c)
{
 unsigned char a0,a1,b0,b1,b2,c0,c1,c2;
 a0=(a& 1 )<< 1 ;
 a1=(a& 2 )>> 1 ;
 b0=(b& 1 )<< 4 ;
 b1=(b& 2 )<< 2 ;
 b2=b& 4 ;
 c0=(c& 1 )<< 7 ;
 c1=(c& 2 )<< 5 ;
 c2=(c& 4 )<< 3 ;
 data.f.Label=c0|c1|c2|b0|b1|b2|a0|a1;
}

template <class T>
void RZ<T>::SetLabel(unsigned a)
{
 int a,b,c;
 a=L/ 100 ;
 b=(L% 100 )/ 10 ;
 c=L% 10 ;
 SetLabel(a,b,c);
}

Далее в другом файле в заголовках включаю
Код: plaintext
#include "rz.h"

Объявляю объекты
Код: plaintext
RZ<RZ016f> RZ016;
RZ016f - структура, объявленная заранее.

для объекта затем вызываю метод
Код: plaintext
RZ016.SetLabel( 16 )

Компилируется без ошибок и прочей нечести.
Но вот при сборке выдает сообщение, что unresolved external RZ<RZ016f>::SetLabel(unsigned int) referensed from ... далее мой файл, в котором объект объявлен и сделан вызов SetLabel.


В чем ошибка?
...
Рейтинг: 0 / 0
27.03.2006, 17:39
    #33627913
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с template
С сожалению, если используешь шаблоны, то тела функций надо описывать в *.h файле. Про раздельную компиляцию придется забыть. Есть еще один рецепт - в cpp файле *с шаблоном*, т.е rz.cpp принудительно инстанциировать шаблон - написать
Код: plaintext
1.
template RZ<RZ016f>;
но при таком подходе можно заполучить проблемы, с которыми новичку не справиться.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с template / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]