首先,请不要对我说教"单例不好"。我已经阅读了关于它的所有内容,并查看了我所拥有的用例的替代方案,它是最适合的。
OK,我正在尝试创建一个方便的c++单例模板,基于我所知道的和我所读到的。我已经说到这里了:
template <class T>
class Singleton{
protected:
Singleton(); // Disallow instantiation outside of the class.
public:
Singleton(const T&) = delete;
T& operator=(const T&) = delete;
Singleton(T &&) = delete;
T& operator=(T &&) = delete;
static auto& Instance(){
static T instance;
return instance;
}
};
class Derived : public Singleton<Derived> {
Derived() {}
friend class Singleton<Derived>;
};
main() {
auto derived = Derived::Instance();
}
当我编译时,我得到链接器错误:
undefined reference to `Singleton<Derived>::Singleton()'
. .我不明白为什么我对模板编程的理解已经到了极限。
我还想避免在派生类和friend类语句中创建构造函数的需要。我理解为什么需要它,但我宁愿能够使用一些模板魔法来为Singleton模板中的派生类创建默认构造函数。我知道构造函数不能被继承,但是我认为模板魔法至少可以自动创建一个。
我认为我在概念上想要做的事情很清楚,所以如果有一个更简单的整体方法可以工作,那也很好。目标是不必为需要定义的每种不同类型的单例编写所有已删除的操作符和实例创建函数。
任何帮助都会被谦卑地接受(只要它不是一个单例讲座:-)
只是一个错别字——你的构造函数缺少它的实现
class Singleton{
protected:
Singleton()=default; // You probably meant this.
public:
//...
};
您已经声明了Singleton<T>
的默认构造函数,但是还没有在任何地方定义它。您可以像这样提供一个内联定义:
template <class T>
class Singleton{
protected:
Singleton() { /* definition goes here */ }
public:
// ...
};
或者如果你不需要在构造函数中做任何特别的事情,就默认它:
template <class T>
class Singleton{
protected:
Singleton() = default;
public:
// ...
};
如果你想让Derived
构造函数为空,也可以省略它:
class Derived : public Singleton<Derived> {
// Derived() {} the compiler will generate this for you
friend class Singleton<Derived>;
};