在模板化类中初始化"T&"类型的静态成员的正确方法是什么?

Nic*_*pat 4 c++ static templates initialization member

我正在玩一个渴望初始化的通用单例类.这个想法是你从类中公开继承:

class foo : public singleton<foo> { };
Run Code Online (Sandbox Code Playgroud)

我在这个过程中学到了很多,但我现在卡住了,因为它破坏了我的Visual Studio 2008链接器.问题在于静态实例成员和/或其初始化.

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T & instance;
};
template<class T> T & T::instance;
Run Code Online (Sandbox Code Playgroud)

任何见解将不胜感激!

编辑:

有了这个班级宣言......

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T instance;
};
template <class T> T singleton<T>::instance;
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时......

class foo : public singleton<foo> { };
Run Code Online (Sandbox Code Playgroud)

我收到这个错误......

错误C2248:'singleton :: singleton':无法访问类'singleton'中声明的私有成员

...

此诊断发生在编译器生成的函数'foo :: foo(void)'中

我的解释是,单要构建一个Foo物体,通过继承,取决于其单构造函数是私有的建设.我认为单身人士可以访问自己的构造函数,但我猜不是.有任何想法吗?

编辑2:

我已经意识到继承的方法singleton<T>有一个问题,就是需要改变类才能用作单例.我最终得到了以下代码,用于我的初始化单例类模板.

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;
}
Run Code Online (Sandbox Code Playgroud)

上课...

class foo {
public:
    void bar() { }
};
Run Code Online (Sandbox Code Playgroud)

...可以使用以下方法访问它的单个实例(在main()之前初始化):

singleton<foo>().bar();
Run Code Online (Sandbox Code Playgroud)

再次感谢您的帮助,尤其是GMan.我对堆栈溢出的第一次体验感到非常满意.

Ada*_*eld 7

你不能,因为你没有具体的实例.您可能需要创建一个可以引用的实际实例:

template <class T>
class singleton {
    ...
private:
    static T instance_;
public:
    static T& instance;
};
template <class T> T singleton<T>::instance_;
template <class T> T& singleton<T>::instance = singleton<T>::instance;
Run Code Online (Sandbox Code Playgroud)

或者,更简单地说,完全放弃参考:

template <class T>
class singleton {
    ...
public:
    static T instance;
};
template <class T> T singleton<T>::instance;
Run Code Online (Sandbox Code Playgroud)