当前位置: 首页 > 知识库问答 >
问题:

尝试使用shared\u ptr创建singleton时发生编译错误

卢阳泽
2023-03-14

我尝试使用shared_ptrs创建一个单例对象。但是,当构造函数/析构函数对特定对象是私有的时,代码不会编译

//ThreadPool.h
class ThreadPool
{
  public:
  static std::shared_ptr<ThreadPool> & getInstance();
  inline static std::shared_ptr<ThreadPool> m_threadPoolInstance;
  private:
  ThreadPool() =default;
~ ThreadPool() = default;
  ThreadPool(ThreadPool const  &) = default;
 };
 //ThreadPool.cpp
#include "pch.h"
#include <ThreadPool.h>

std::shared_ptr<ThreadPool> & ThreadPool::getInstance()
{
    if (! m_threadPoolInstance)
    {
        ThreadPool * p_ThreadPool = new ThreadPool();
        m_threadPoolInstance.reset(p_ThreadPool);
    }
    return m_threadPoolInstance;
}

我正在使用VS17编译器创建的错误如下

错误C2440:":无法从'_Ux*'转换为'std::shared_ptr'与[_Ux=ThreadPool]包含\内存(1462):注意:没有构造函数可以采取源类型,或构造函数重载解决方案是含糊不清的threadpool.cpp(9):注意:请参阅引用函数模板实例化'空std::shared_ptr重置(_Ux*)'正在编译与[_Ux=ThreadPool]threadpool.cpp(9):注意:请参阅引用函数模板实例化'空std::shared_ptr::重置(_Ux*)'正在编译与[_Ux=ThreadPool]

当我在公共部分设置构造函数/析构函数时,编译成功了。

但是,使用gcc编译器运行相同的代码,编译成功

共有1个答案

华誉
2023-03-14

转换失败,因为您的线程池类有一个私有析构函数。

正在调用<代码>。重置(ptr)将使用delete表达式(delete ptr;)作为deleter,这要求析构函数是公共的。

请参阅此处的重载(2):https://en.cppreference.com/w/cpp/memory/shared_ptr/reset

2-4)将托管对象替换为ptr指向的对象。Y必须是完整类型,并且可以隐式转换为T。此外:

2) 使用delete表达式作为删除器。有效的delete表达式必须可用,即delete ptr必须格式良好,具有定义良好的行为,并且不会引发任何异常。相当于shared\u ptr(ptr)。交换(*此);。

您需要公开析构函数或提供自定义删除器。

 类似资料:
  • 问题内容: 我正在尝试将此JPA QL转换为条件构建器。JBoss 6.0。 我根据一些教程编写了此代码。 但是,我在一行中遇到了一个编译错误: 错误是: 问题答案: 好吧,我终于找到了调用gt()方法的正确方法。这是完整的解决方案。在JBoss 6中经过全面测试。

  • 我试图从部署在Jetty中的war中实现一个JSR356 websocket连接。 我将此作为指南:http://aredko.blogspot.com/2013/11/java-websockets-jsr-356-on-jetty91.html (我可以找到很多关于在嵌入式jetty服务器上基本使用JSR356的教程,但是没有关于在现有服务器中构建websocket连接的教程--有什么好的教程

  • 我的系统中有以下配置: Apache Maven 3.5.2 Maven主页: /usr/share/mavenJava版本:1.8.0_162,供应商:Oracle CorporationJava主页: /usr/lib/jvm/java-8-openjdk-amd64/jre默认语言环境:en_US,平台编码:UTF-8操作系统名称:"linux",版本:"4.15.0-20-通用", arc

  • 当我在phoenix中登录sqlline.py或试图通过API在phoenix中创建表时,我会遇到一个异常。 由于我对phenix的知识有限,我无法弄清楚为什么phoenix在创建System.Catalog表之前就要检查它。 StackTrace: *4/11/18 06:07:18警告客户端。HConnectionManager$HConnectionImplementation:预取元表时遇

  • 我是Java编程的新手,我正在自学。 在运行javac时遇到一些问题后,我再次检查了windows地址和类路径,并将它们设置为正确的目录路径。问题解决了,因为现在当我输入'javac-version'时,我得到的版本显示java comilier已经安装。因此,现在我正试图从命令提示符运行一个Helloworld程序,以便检查基本功能!(我没有使用Eclipse,因为我还没有准备好增加额外的复杂性

  • 我正在使用Context.SendorderedBroadcast方法发送广播,并在到达ResultReceiver之前检查是否有人收到了广播。 下面是一段代码: 到目前为止,我只在搭载Android 2.1版本的摩托罗拉Defy手机上遇到过这种情况,但它也可能发生在其他手机上。 我在网上找不到任何关于它的参考资料,有人知道为什么会这样吗?谢谢!