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

标签 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() 的引用。

这可能是什么原因。

最佳答案

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

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;
};

关于c++ - 单例对象模板类的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3341885/

相关文章:

c++ - 基于编译器选项的已编译二进制路径

c# - 从 Lua 5.1 移植到 5.2

wpf - 在WPF中动态添加网格和控件

c++ - 如何返回嵌套在其他包中的模板包?

c++ - FPU 命令 FLDL 将 ST0 中的 double 转换为 long double

c++ - 从未加权图中打印最短路径

c++ - C++11 中无开销的别名模板最佳替代方案的专门化

c++ - template 模板类,如果存在就调用一个函数

c++ - 按值返回时不调用应对构造函数

c++ - 如何使用 _GLIBCXX_DEBUG 构建 Boost 版本?