У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)
class NewsDlg;
class AudioDlg;
class ToolBar
{
private:
NewsDlg* p1;
AudioDlg* p2;
private:
template <typename ClassName>
ClassName* CreateNewDialog (UINT resourceID)
{
ClassName* p = new ClassName;
p->Create (resourceID);
return p;
}
};
где то вызываю..
void ToolBar::Init ()
{
p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
}
если функцию CreateNewDialog делаю глобальной, то все в порядке
Здравствуйте, Аноним, Вы писали:
А>У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)
class NewsDlg;
class AudioDlg;
class ToolBar
{
private:
NewsDlg* p1;
AudioDlg* p2;
private:
template <typename ClassName>
static ClassName* CreateNewDialog (UINT resourceID)
{
ClassName* p = new ClassName;
p->Create (resourceID);
return p;
}
};
Здравствуйте, Аноним, Вы писали:
А>У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)
................
А>
А>void ToolBar::Init ()
А>{
А> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
А>}
А>
А>если функцию CreateNewDialog делаю глобальной, то все в порядке
Уверен что в файле где находится ToolBar::Init класс NewsDlg видим (я вижу только forward declaration)?
P.S. Неплохо бы текст сообщения об ошибке приводить. Обычно на здесь на вопросы подобные вашему говорят что телепаты в отпуске
> void ToolBar::Init ()
> {
> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
> }
>
>> void ToolBar::Init ()
>> {
>> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
>> }
>>
Здравствуйте, jedi, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)
J>................
А>>
А>>void ToolBar::Init ()
А>>{
А>> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
А>>}
А>>
А>>если функцию CreateNewDialog делаю глобальной, то все в порядке
J>Уверен что в файле где находится ToolBar::Init класс NewsDlg видим (я вижу только forward declaration)?
J>P.S. Неплохо бы текст сообщения об ошибке приводить. Обычно на здесь на вопросы подобные вашему говорят что телепаты в отпуске
J>Best regards, J>jedi
error C2275: 'NewsDlg' : illegal use of this type as an expression
Здравствуйте, Аноним, Вы писали:
>>> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg ME>>Ты, наверное, используешь VC6? А>yes
Тогда добавь фейковый параметр — указатель на параметр шаблона.
И вызывай как CreateNewDialog(IDD_1,(NewsDlg*)0);
Re[4]: template function as class member
От:
Аноним
Дата:
10.07.05 12:30
Оценка:
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, Аноним, Вы писали:
>>>> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg ME>>Ты, наверное, используешь VC6? А>>yes
AC>Тогда добавь фейковый параметр — указатель на параметр шаблона. AC>И вызывай как CreateNewDialog(IDD_1,(NewsDlg*)0);
Здравствуйте, <Аноним>, Вы писали:
>>>>> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg ME>>Ты, наверное, используешь VC6? А>>>yes
AC>>Тогда добавь фейковый параметр — указатель на параметр шаблона. AC>>И вызывай как CreateNewDialog(IDD_1,(NewsDlg*)0);
А>А почему именно так?
VC6 не поддерживает (по-нормальному, по крайней мере) явное указание типа при вызове шаблонной функции, так что приходится вводить "специальный" параметр функции, позволяющий компилятору "догадаться", какой именно тип использовать. template <typename ClassName> ClassName* CreateNewDialog (UINT resourceID, ClassName*) в объявлении и CreateNewDialog(IDD_1,(NewsDlg*)0) при вызове — простой и очевидный способ этого добиться.
Хотя у меня, помнится, были с ним проблемы (какие-то глюки с const). Так что я бы рекомендовал вместо ClassName* использовать что-то вроде Type2Type<ClassName> (это из Loki).
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: template function as class member
От:
Аноним
Дата:
29.07.05 15:05
Оценка:
Здравствуйте, pvgoran, Вы писали:
P>Здравствуйте, <Аноним>, Вы писали:
>>>>>> p1 = CreateNewDialog <NewsDlg> (IDD_....); // вот здесь компилятор орет что нельзя использовать NewsDlg ME>>Ты, наверное, используешь VC6? А>>>>yes
AC>>>Тогда добавь фейковый параметр — указатель на параметр шаблона. AC>>>И вызывай как CreateNewDialog(IDD_1,(NewsDlg*)0);
А>>А почему именно так?
P>VC6 не поддерживает (по-нормальному, по крайней мере) явное указание типа при вызове шаблонной функции, так что приходится вводить "специальный" параметр функции, позволяющий компилятору "догадаться", какой именно тип использовать. template <typename ClassName> ClassName* CreateNewDialog (UINT resourceID, ClassName*) в объявлении и CreateNewDialog(IDD_1,(NewsDlg*)0) при вызове — простой и очевидный способ этого добиться.
P>Хотя у меня, помнится, были с ним проблемы (какие-то глюки с const). Так что я бы рекомендовал вместо ClassName* использовать что-то вроде Type2Type<ClassName> (это из Loki).
теперь вот такая функция в классе:
class A
{
CCommonChat* pChat;
template <typename T>
void AddDialogToTab (T* p, UINT resourceID, CTabCtrl& tab)
{
p = new T;
if (p)
{
if (!tab.AddTab (p, resourceID))
AfxMessageBox ("Error while adding tab", MB_ICONSTOP);
}
}
}
вызываю ее как
AddDialogToTab <CCommonChat> (pChat, IDD);
опять орет что illegal use of this type as an expression
Здравствуйте, <Аноним>, Вы писали:
А>теперь вот такая функция в классе:
А>
А>class A
А>{
А> CCommonChat* pChat;
А> template <typename T>
А> void AddDialogToTab (T* p, UINT resourceID, CTabCtrl& tab)
А> {
А> p = new T;
А> if (p)
А> {
А> if (!tab.AddTab (p, resourceID))
А> AfxMessageBox ("Error while adding tab", MB_ICONSTOP);
А> }
А> }
А>}
А>
А>вызываю ее как
А>AddDialogToTab <CCommonChat> (pChat, IDD);
А>опять орет что illegal use of this type as an expression
Дык, я же про это писал:
P>>VC6 не поддерживает (по-нормальному, по крайней мере) явное указание типа при вызове шаблонной функции, так что приходится вводить "специальный" параметр функции, позволяющий компилятору "догадаться", какой именно тип использовать. template <typename ClassName> ClassName* CreateNewDialog (UINT resourceID, ClassName*) в объявлении и CreateNewDialog(IDD_1,(NewsDlg*)0) при вызове — простой и очевидный способ этого добиться.
Т.е. угловые скобки не работают. В Вашем случае нужно вызывать так: