Bonjour à tous !

Je suis en train d'améliorer mon lot d'outils et j'ai pensé me faire une classe Singleton. J'ai suivi le tutoriel ici et je n'arrive pas à instancier ma classe. J'ai les erreurs suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
main.o: In function `cbl::Singleton<cbl::LonelyClass>::getInstance()':
/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:18: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:19: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:20: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
main.o: In function `cbl::Singleton<cbl::LonelyClass>::kill()':
/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:22: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:23: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
main.o:/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:24: more undefined references to `cbl::Singleton<cbl::LonelyClass>::m_instance' follow
collect2: ld a retourné 1 code d'état d'exécution
J'ai rassemblé pour vous un code minimal :

pattern.hpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
#ifndef PATTERN_HPP
#define PATTERN_HPP
 
#include "libcbl-shared_global.h"
 
using namespace std;
namespace cbl{
 
template <typename T> class LIBCBLSHAREDSHARED_EXPORT Singleton
{
/*  Use by declaring a subclass, i.e.
 *    class UniqueObject : public Singleton<UniqueObject>{};
 */
public:
  static T *getInstance(){
    if( m_instance == NULL )
      m_instance = new T;
    return ( static_cast<T*> (m_instance) );
  }
 
  static void kill(){
    if( m_instance != NULL ){
      delete m_instance;
      m_instance = NULL;
    }
  }
 
protected:
  Singleton (){}
  ~Singleton(){}
 
private:
  static T * m_instance;
};  // class Singleton
 
class LIBCBLSHAREDSHARED_EXPORT LonelyClass
    : public Singleton<LonelyClass>
{
  friend class Singleton<LonelyClass>;
 
private:
  LonelyClass(){}
  ~LonelyClass(){}
 
};   // class LonelyClass
 
// LA SOLUTION AU PROBLEME EST LES DEUX LIGNES SUIVANTES
template <typename T>
T *Singleton<T>::m_instance = NULL;
 
}   // namespace cbl
#endif // PATTERN_HPP
main.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
#include <pattern.hpp>
using namespace cbl;
int main()
{
  LonelyClass *fh;
  fh = LonelyClass::getInstance();
  fh->kill();
  return 0;
}
Avez-vous un indice ?

EDIT :
Le code ci-dessous contient la solution (fichier pattern.hpp). La réponse se trouvait dans la FAQ C++ : dans la section des erreurs générées par des membres statiques.

Le titre à été modifié pour mieux décrire le problème.

Merci !