单例对象的模板类的静态初始化

时间:2010-07-27 08:34:34

标签: c++ templates gcc

我们有一个单独的模板类,如下面的定义

  template<class T> class Singleton{

     T& reference(){
       return objT;
    }

    private:
     T objT;

    };

And another user defined class which uses this singleton

   class TestClass{

    static Singleton<TestClass> instance;

    static TestClass * getPointer()
    {
      return &instance.objT;
    }


   private:
     TestClass(){}
   };

   template<TestClass>
    Singleton<TestClass> TestClass::instance;

在使用GCC进行编译时,我们收到错误

在函数static_initialization_and_destruction中对Singleton :: Singleton()的未定义引用。

这可能是什么原因。

3 个答案:

答案 0 :(得分:1)

忽略这个事实,在你的例子中不需要Singleton模板,考虑这个简化的例子(我使用结构来避免访问问题):

template <class T> 
struct Singleton
{
    T object;
};

struct TestClass;
typedef Singleton<TestClass> TCS;

TCS test1;            // not ok, no definition of TestClass available;

struct TestClass
{
    TestClass(){}
    static TCS test2; // not ok, no definition of TestClass available;
};

TCS test3;            // ok, TestClass is defined;

要声明类型T的成员,您需要此类型T的完整定义。因此,test1和test2不合法 - 只有声明,而不是T的定义。相反,test3是合法的 - 它位于完整的类定义之后。这里最容易解决的是使用指针键入 - 要声明一个指向T类型的指针,你需要一个声明而不是T类型的定义:

template <class T> 
struct Singleton
{
    T * object;
};

答案 1 :(得分:0)

static Singleton<TestClass> instance;

你实际上是想在上面的行中创建一个类Singleton的实例;这将寻找默认构造函数Singleton()(已经存在,因为您没有明确地将其定义为私有)。

T& reference()是您班级中的私人方法。

我真的不明白这个

 template<TestClass>
    Singleton<TestClass> TestClass::instance;

你确定你想要做什么吗?原因不是;)

也许您想要阅读此内容以了解您在做什么http://www.yolinux.com/TUTORIALS/C++Singleton.html

答案 2 :(得分:0)

最简单的修复:不要使用单身。