我们有一个单独的模板类,如下面的定义
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()的未定义引用。
这可能是什么原因。
答案 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)
最简单的修复:不要使用单身。