我正在尝试实现一个使用meyers单例的单例模板:
#include <bits/stdc++.h>
template <typename T>
class Singleton {
public:
static T& instance() {
static T _instance;
return _instance;
}
protected:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton & s) = delete;
Singleton& operator=(const Singleton & s) = delete;
};
class Foo : Singleton<Foo> {
public:
void print() {
std::cout<<"from the foo singleton count : " <<count++<<std::endl;
}
private:
int count = 0;
};
int main () {
Singleton<Foo>::instance().print();
Singleton<Foo>::instance().print();
Singleton<Foo>::instance().print();
return 0; 它似乎起作用了:link
但现在我希望能够像这样使用它:
Foo::instance().print();有什么办法可以做到吗?
发布于 2021-08-19 13:06:35
您正在对class Foo : Singleton<Foo>使用私有继承,这意味着对外部世界来说,Foo不是Singleton<Foo>,它也没有instance函数。您可以添加
using Singleton<Foo>::instance;添加到Foo的公共部分。这将把instance函数导入到Foo的公共空间中,并允许
Foo::instance().print();编译。
发布于 2021-08-19 13:05:07
您应该阅读尝试调用Foo::instance().print()时产生的错误消息,因为它会告诉您错误所在:
<source>:30:17: error: 'static T& Singleton<T>::instance() [with T = Foo]' is inaccessible within this context
30 | Foo::instance().print();
| ~~~~~~~~~~~~~^~无法通过Foo::instance()访问Singleton<T>::instance(),因为Foo是私有继承的。让Foo公开继承,它就可以工作了。
https://stackoverflow.com/questions/68848364
复制相似问题