首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有meyers单例的单例CRTP

带有meyers单例的单例CRTP
EN

Stack Overflow用户
提问于 2021-08-19 13:00:31
回答 2查看 76关注 0票数 1

我正在尝试实现一个使用meyers单例的单例模板:

代码语言:javascript
复制
#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

但现在我希望能够像这样使用它:

代码语言:javascript
复制
Foo::instance().print();

有什么办法可以做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-19 13:06:35

您正在对class Foo : Singleton<Foo>使用私有继承,这意味着对外部世界来说,Foo不是Singleton<Foo>,它也没有instance函数。您可以添加

代码语言:javascript
复制
using Singleton<Foo>::instance;

添加到Foo的公共部分。这将把instance函数导入到Foo的公共空间中,并允许

代码语言:javascript
复制
Foo::instance().print();

编译。

票数 3
EN

Stack Overflow用户

发布于 2021-08-19 13:05:07

您应该阅读尝试调用Foo::instance().print()时产生的错误消息,因为它会告诉您错误所在:

代码语言:javascript
复制
<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公开继承,它就可以工作了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68848364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档