¿Cuál es la forma correcta de inicializar un miembro estático de tipo 'T &' en una clase de plantilla?

Estoy jugando con una clase de singleton genérico de inicialización impaciente. La idea es que usted herede públicamente de la clase así:

class foo : public singleton<foo> { };

He aprendido mucho en el proceso, pero ahora estoy atascado porque está rompiendo mi enlazador de Visual Studio 2008. El problema es con el miembro de la instancia estática y / o su inicialización.

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T & instance;
};
template<class T> T & T::instance;

¡Cualquier idea sería muy apreciada!

EDITAR:

Con esta declaración de clase ...

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T instance;
};
template <class T> T singleton<T>::instance;

Cuando trato de hacer esto ...

class foo : public singleton<foo> { };

Me sale este error ...

error C2248: 'singleton :: singleton': no ​​se puede acceder al miembro privado declarado en la clase 'singleton'

...

Este diagnóstico se produjo en la función generada por el compilador 'foo :: foo (void)'

Mi interpretación es que singleton quiere construir un objeto foo que, por herencia, depende de la construcción de un singleton cuyo constructor sea privado. Pensé que Singleton tendría acceso a su propio constructor, pero supongo que no. ¿Algunas ideas?

EDIT 2:

Me he dado cuenta de que el enfoque de heredar desingleton<T> tiene el problema de requerir un cambio en la clase para ser usado como un singleton. Terminé con el siguiente código para mi plantilla de clase singleton de inicialización impaciente.

template<typename T>
class singleton_wrapper {
    singleton_wrapper();
    singleton_wrapper(singleton_wrapper const &);
    singleton_wrapper & operator = (singleton_wrapper const &);
    static T instance;
    template<typename T> friend T & singleton();
};
template<typename T> T singleton_wrapper<T>::instance;

template<typename T>
T & singleton() {
    return singleton_wrapper<T>::instance;
}

Para clase...

class foo {
public:
    void bar() { }
};

... Uno podría acceder a una sola instancia de ella (inicializada antes de main ()) usando lo siguiente:

singleton<foo>().bar();

Gracias de nuevo por la ayuda, especialmente GMan. Estoy muy contento con mi primera experiencia en la pila.rebosar.

Respuestas a la pregunta(2)

Su respuesta a la pregunta