Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Шаблоны и MFC


Автор: DENNN 8.2.2003, 22:11
Ситуация:
Есть обычный диалог, порожденный от CDialog
Хочу сделать его в виде шаблона:
template <class T>
class CMyDLG : public CDialog
{
public:
.........................
}

Компилятор застревает на макросе
BEGIN_MESSAGE_MAP(CMyDLG, CDialog)
//{{AFX_MSG_MAP(CGLOSSARYDLG)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
с сообщением, что необходимо указать список параметров шаблона.

Вопрос: кто-нибудь знает как можно обойти подобные ошибки не переписывая макросы?
А если один макрос править, потом окажеться что еще половину библиотеки под проект надо править? mad.gif

Автор: DENNN 11.2.2003, 20:39
Что даже идей никаких?

P.S. Ответы вроде "MFC написано без поддержки шаблонов" можно не давать.

Автор: Vyacheslav 11.2.2003, 21:05
Я не специалист по MFC,
но я бы попытался сделать так ,исходя что макрос BEGIN_MESSAGE_MAP
и т.д. всего лишь реализация функции класса. Во всяком случае так обстоит дело у Borland'а

Цитата

template <class T>
class CMyDLG : public CDialog
{
public:
.........................
}


template <class T>
BEGIN_MESSAGE_MAP(CMyDLG<T>, CDialog)
//{{AFX_MSG_MAP(CGLOSSARYDLG)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

Может сработает.


Автор: Vyacheslav 11.2.2003, 21:54
Сейчас посмотрел MFC-ский макрос и понял что мое предложение не пройдет
Код

#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* theClass::GetMessageMap() const \
 { return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \

#endif


Проще всего макрос руками заменить на его содержание

Код

template <class T> const AFX_MSGMAP* CMyDLG<T> ::GetMessageMap() const
 { return &CMyDLG<T>::messageMap; }
template <class T>  AFX_COMDAT AFX_DATADEF const AFX_MSGMAP CMyDLG<T> ::messageMap = \
{ &CDialog::messageMap, &CMyDLG<T> ::_messageEntries[0] };
...

Ну и так далее

Автор: DENNN 12.2.2003, 04:11
Я бы уже давно переписал,но все дело в том что:
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
содержит еще три макроса, вероятнее всего каждый из них генериться в разных вариантах для ANSI/UNICODE, winNT/win98,......

Риск, что у заказчика в какойто конфигурации прога не пойдет велик.
Хочу быть уверенным наверняка, а в этом варианте значит придеться переписать и эти макросы, в них другие....sad.gif

Автор: TaTaP 15.2.2003, 03:42
Не знаю, может это и тупой ответ, но многие люди, используя шаблоны, забывают, что все определения шаблонных функций и классов ( и внутренние шаблоны тоже ) нужно описывать в одном файле. Делать как обычно - декларация класса - в одном файле, .h, а реализация - в другом, нельзя. Попробуй все слить в один файл, может прокатит...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)