template function as class member
От: Аноним  
Дата: 09.07.05 13:47
Оценка:
У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)


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 делаю глобальной, то все в порядке
Re: template function as class member
От: _nn_ www.nemerleweb.com
Дата: 09.07.05 14:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)


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;
       }
};
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: template function as class member
От: jedi Мухосранск  
Дата: 09.07.05 14:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня есть класс диалога, который порождает много других диалогов. Пытаюсь создать метод класс (темплейт), который бы создавал эти диалоги. что то примерно так..(пишу с сокращениями)


................

А>
А>void ToolBar::Init ()
А>{
А>   p1 = CreateNewDialog <NewsDlg> (IDD_....);  // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
А>}
А>


А>если функцию CreateNewDialog делаю глобальной, то все в порядке



Уверен что в файле где находится ToolBar::Init класс NewsDlg видим (я вижу только forward declaration)?

P.S. Неплохо бы текст сообщения об ошибке приводить. Обычно на здесь на вопросы подобные вашему говорят что телепаты в отпуске

Best regards,
jedi
Re: template function as class member
От: MaximE Великобритания  
Дата: 09.07.05 15:43
Оценка:
On Sat, 09 Jul 2005 17:47:31 +0400, wrote:

[]

>
> void ToolBar::Init ()
> {
>    p1 = CreateNewDialog <NewsDlg> (IDD_....);  // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
> }
>


Ты, наверное, используешь VC6?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: template function as class member
От: Аноним  
Дата: 09.07.05 23:39
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Sat, 09 Jul 2005 17:47:31 +0400, wrote:


ME>[]


>>
>> void ToolBar::Init ()
>> {
>>    p1 = CreateNewDialog <NewsDlg> (IDD_....);  // вот здесь компилятор орет что нельзя использовать NewsDlg класс ПОЧЕМУ?
>> }
>>


ME>Ты, наверное, используешь VC6?


ME>--

ME>Maxim Yegorushkin

yes
Re[2]: template function as class member
От: Аноним  
Дата: 09.07.05 23:47
Оценка:
Здравствуйте, 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
Re[3]: template function as class member
От: Alexey Chen Чили  
Дата: 10.07.05 07:52
Оценка:
Здравствуйте, Аноним, Вы писали:

>>> 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);

А почему именно так?
Re[5]: template function as class member
От: pvgoran Россия  
Дата: 10.07.05 13:32
Оценка:
Здравствуйте, <Аноним>, Вы писали:

>>>>> 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
Re[7]: template function as class member
От: pvgoran Россия  
Дата: 30.07.05 07:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>теперь вот такая функция в классе:


А>
А>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) при вызове — простой и очевидный способ этого добиться.


Т.е. угловые скобки не работают. В Вашем случае нужно вызывать так:

AddDialogToTab((CCommonChat*)NULL, pChat, IDD);
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.