Как правильно инициализировать статический член типа 'T &' в шаблонном классе?

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

class foo : public singleton { };

я многому научился в процессе, но яя застрял прямо сейчас, потому что этоломает мой компоновщик Visual Studio 2008 Проблема в члене статического экземпляра и / или его инициализации.

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

Любое понимание будет с благодарностью!

РЕДАКТИРОВАТЬ:

С этим объявлением класса ...

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

Когда я пытаюсь сделать это ...

class foo : public singleton { };

Я получаю эту ошибку ...

ошибка C2248: 'одноточечно :: одноточечно» : не может получить доступ к закрытому члену, объявленному в классе 'синглтон»

...

Эта диагностика произошла в функции, сгенерированной компиляторомFoo :: Foo (аннулируются)»

Моя интерпретация заключается в том, что синглтон хочет создать объект foo, который по наследству зависит от конструкции синглтона, конструктор которого является приватным. Я полагал, что синглтон будет иметь доступ к своему собственному конструктору, но я думаю, что нет. Есть идеи?

РЕДАКТИРОВАТЬ 2: Я

мы поняли, что подход наследования отsingleton имеет проблему с требованием изменения класса для использования в качестве одиночного. Я'В итоге я получил следующий код для моего шаблона инициализации синглтона.

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

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

Для класса...

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

... Можно получить доступ к одному его экземпляру (инициализированному перед main ()), используя следующее:

singleton().bar();

Еще раз спасибо за помощь, особенно GMan. Я'я очень доволен своим первым опытом в стекеoverflow.I»

Ответы на вопрос(2)

Ваш ответ на вопрос