powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с template
2 сообщений из 2, страница 1 из 1
проблема с template
    #33627880
matsic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 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
проблема с template
    #33627913
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С сожалению, если используешь шаблоны, то тела функций надо описывать в *.h файле. Про раздельную компиляцию придется забыть. Есть еще один рецепт - в cpp файле *с шаблоном*, т.е rz.cpp принудительно инстанциировать шаблон - написать
Код: plaintext
1.
template RZ<RZ016f>;
но при таком подходе можно заполучить проблемы, с которыми новичку не справиться.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с template
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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