powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Класс для маскирования события - ошибка при линковке
3 сообщений из 3, страница 1 из 1
Класс для маскирования события - ошибка при линковке
    #34996618
AndrewP_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал класс для маскирования события (CBuilder 6):
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.
#ifndef DisableEventH
#define DisableEventH
//---------------------------------------------------------------------------
#include <ADODB.hpp>
//---------------------------------------------------------------------------
//Определить тип события с параметрами - Проверка поля
typedef void __fastcall
(__closure *TOnValidateEvent) (TField *Sender);
//Определить тип события с параметрами - Расчет вычисляемых полей
typedef void __fastcall
(__closure *TOnCalcFieldsEvent) (TDataSet *DataSet);
//---------------------------------------------------------------------------

//Класс для маскирования события
template <typename T>
class DisableEvent
{
public:		// User declarations
	__fastcall DisableEvent(T &Event);
	__fastcall ~DisableEvent<T>(void);

private:
	T *_Event;
	T cEvent;

};
//---------------------------------------------------------------------------
#endif
c
Код: 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.
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
//---------------------------------------------------------------------------
#include "DisableEvent.h"

//Реализация класса для маскирования события
template <typename T>
__fastcall DisableEvent<T>::DisableEvent(T &Event)
{
_Event=&Event;  

cEvent=*_Event;
*_Event= 0 ;    //Маскировать событие

}
//Eof:DisableEvent
//---------------------------------------------------------------------------

template <typename T>
__fastcall DisableEvent<T>::~DisableEvent(void)
{
*_Event=cEvent;  //Восстановить адрес функции события
}
//Eof:~DisableEvent
//---------------------------------------------------------------------------

В основной функции использую класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void __fastcall TfrmRestList::adsRestListT_RESTValidate(TField *Sender)
{

//Маскировать событие OnValidate, чтобы предовратить
//циклический вызов adsRestListT_RESTValidate при изменении поля
DisableEvent<TOnValidateEvent> Event(adsRestListT_REST->OnValidate);
 
. . .
Sender->AsString=" . . .";
. . . 

}
При линковке пишет:
[ILINK32] Error: Unresolved external '__fastcall DisableEvent<void __fastcall __closure(*)(Db::TField *)>::DisableEvent<void __fastcall __closure(*)(Db::TField *)>(void __fastcall __closure(*)(Db::TField *)&)' referenced from D:\WORK\C__BUILDER\PAY_C\OBJ\OPDATARESTLIST.OBJ

Причем, если сделать вместо шаблона класса класс с конкретным типом события, проходит все нормально.
...
Рейтинг: 0 / 0
Класс для маскирования события - ошибка при линковке
    #34996621
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так реализацию шаблона надо тоже в h писать...
...
Рейтинг: 0 / 0
Класс для маскирования события - ошибка при линковке
    #34996655
AndrewP_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slipтак реализацию шаблона надо тоже в h писать...
Большое спасибо! Дело именно в этом. Все работает прекрасно.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Класс для маскирования события - ошибка при линковке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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