template + static (dependent name is not a type)

0

MSVC

template<DWORD dwSvcNameIDS>
class ServiceApp: public ServiceAppBase
{
protected:
   static TCHAR pServiceName[MAX_PATH];
private:
   struct ServiceAppStatic 
   {
      ServiceAppStatic() 
      { 
         LoadString(GetModuleHandle(NULL), dwSvcNameIDS, pServiceName, MAX_PATH);      
      }
   };
   static ServiceAppStatic serviceAppStatic;
};

template<DWORD dwSvcNameIDS>
TCHAR ServiceApp<dwSvcNameIDS>::pServiceName[MAX_PATH];

template<DWORD dwSvcNameIDS>
ServiceApp<dwSvcNameIDS>::ServiceAppStatic ServiceApp<dwSvcNameIDS>::serviceAppStatic; //<--- TU ------

Warning 1 warning C4346: 'ServiceApp<dwSvcNameIDS>::StaticInit' : dependent name is not a type
Error 2 error C2143: syntax error : missing ';' before 'ServiceApp<dwSvcNameIDS>::staticInit'

;-(

// ej no misiek dobrze wiesz co sie robi z watkami z takimi tematami, popraw [mf]
// no nie za bardzo wiem co napisać :/ -adf88
// dokladnie cos w ten desen :) [mf]

0

typename użyj. cholera nie mam żadnego kompilatora pod ręką... tak spróbuj:

template<DWORD dwSvcNameIDS>
typename ServiceApp<dwSvcNameIDS>::ServiceAppStatic ServiceApp<dwSvcNameIDS>::serviceAppStatic;

masz słowo kluczowe, które dokładnie takie problemy rozwiązuje, a doświadczony jesteś, na pewno znajdziesz jak wybrnąć, i co ono robi.

0

Poszło dokładnie tak jak napisałeś :) Dzięki [browar]

Trzeba było tylko jeszcze mały trick zastosować. pÓÓÓÓki obiekt serviceAppStatic jest nieużywany jego konstruktor nie zostanie wywołany. Więc dodałem do ServiceAppStatic pustą metodę którą wywołuje w konstruktorze ServiceApp:

template <DWORD dwSvcNameIDS>
class ServiceApp: public ServiceAppBase
{
protected:
   static TCHAR pServiceName[MAX_PATH];
private:
   struct ServiceAppStatic
   {
      ServiceAppStatic()
      {
         LoadString(GetModuleHandle(NULL), dwSvcNameIDS, pServiceName, MAX_PATH);     
      }
      void Void() {} //pusta metoda
   };
   static ServiceAppStatic serviceAppStatic;
public:
   ServiceApp() { serviceAppStatic.Void(); } //wywolanie pustej metody gwarantuje utworzenie serviceAppStatic
};

template <DWORD dwSvcNameIDS>
TCHAR ServiceApp<dwSvcNameIDS>::pServiceName[MAX_PATH];

template <DWORD dwSvcNameIDS>
typename ServiceApp<dwSvcNameIDS>::ServiceAppStatic ServiceApp<dwSvcNameIDS>::serviceAppStatic;

1 użytkowników online, w tym zalogowanych: 0, gości: 1