2012-03-12 2 views
-1

У меня есть система классов, наследующая от шаблона, который наследует от Singleton.Ошибка связывания с вложенными шаблонами

Проблема в том, что статический член * ms_Singleton * не может быть правильно связан в специализированной версии моего класса. И я получил следующее сообщение об ошибке:

error LNK2001: unresolved external symbol "protected: static class MyBase * Singleton >::ms_Singleton"

Мой код:

template <typename T> 
class Singleton 
{ 
protected: 
    static T* ms_Singleton; 

public: 
    Singleton(void) 
    { 
     ms_Singleton = static_cast< T* >(this); 
    } 
    static void init(void){}; 
    static T& getSingleton(void) 
    { assert(ms_Singleton); return (*ms_Singleton); } 
}; 



template <class T> 
class MyBase : public Singleton< MyBase<T> > 
{ 
    public: 
     MyBase() 
     { 
     } 
}; 


/*template <class T> 
MyBase<T>* Singleton< MyBase<T> >::ms_Singleton = 0;*/ 

class MySpecialized : public MyBase<MySpecialized > 
{ 
    public: 
     MySpecialized() 
     { 
     } 
}; 

template <> 
MySpecialized* Singleton<MySpecialized>::ms_Singleton = 0; 

int main() 
{ 
    MySpecialized t; 
} 

ответ

1

Просто изменить

template <class T> 
Base<T>* Singleton< Base<T> >::ms_Singleton = 0; 

в

template <class T> 
T* Singleton<T>::ms_Singleton = 0; 

Проверить http://ideone.com/7B0Da

+0

Thanx Pawel !! Это работает как образец в моем примере проекта! Я попытаюсь реализовать его сейчас в своем большом проекте. :) – matt

+1

@zmatz Приятно это слышать. Пожалуйста, примите ответ - должен быть какой-то зеленый знак ok ниже точек слева. –