我们有一个如下定义的单例模板类
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/