Classe singleton template et reinterpret_cast rejeté par GCC
Bonsoir,
le code suivant est un emprunt au tuto de David Come sur les pattern objet en C++.
Je voudrais créer une classe template Singleton,
et je cherche à lui fournir un opérateur de comparaison qui prendrait des entiers.
Je ne parviens pas à écrire son code template.
le code de singleton_tpl.tpp avec le nécessaire opérateur == :
Code:
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
| #include <stdio.h>
#include <iostream>
using namespace std ;
template <class T> T Singleton<T>::m_i = T();
template <class T> T& Singleton<T>::instance()
{
if(m_i == 0) // premier check
{
// CODE to lock myself
lock() ;
if(m_i == 0) // second
{
m_i = // phase 3 de la liste
static_cast<T*>(operator new(sizeof(T))) ; // phase 1
new (m_i) T; // phase 2
UUID = rand () ;
pthread_mutex_init (&mutex, NULL) ;
}
if (m_i != 0) // l'objet est bien initialisé
{
unlock() ; // ici on déverrouille simplement
} // un des threads,
}
return m_i; // ainsi il suffit d'appeler instance () plusieurs fois
} // pour être sûr de déverrouiller notre thread
template <class T> void Singleton<T>::lock()
{
pthread_mutex_lock (&mutex) ;
}
template <class T> void Singleton<T>::unlock()
{
pthread_mutex_unlock (&mutex) ;
}
template <class T> bool Singleton<T>::operator==(int i) const
{
if ( UUID == (reinterpret_cast<T>(i)).UUID )
{
return true ;
}
return false ;
} |
Le compilateur (g++) me dit que mon reinterpret_cast est illégal.
Est-ce que je fais fausse route ?
Merci.