c++ 创建对象,make_shared报错

#代码报错


error: static_assert failed due to requirement 'is_constructible<PrefetchTask>::value' "Can't construct object in make_shared"

std::shared_ptr<PrefetchTask> prefetchVideoTask = std::make_shared<PrefetchTask>();
/***
In template: static_assert failed due to requirement 'is_constructible<PrefetchTask>::value' 
"Can't construct object in make_shared" error occurred here in instantiation of function 
template specialization 'std::shared_ptr<PrefetchTask>::make_shared<>' requested here in 
instantiation of function template specialization 'std::make_shared<PrefetchTask>' requested here
***/

//PrefetchTask.h
#pragma once
#include <string>
#include <mutex>
#include "ABRUtils.h"

class PrefetchTask {
public:
    PrefetchTask();
    PrefetchTask(const std::string& url,int selectedLevel = 0);
    virtual ~PrefetchTask();

    void execute();

    std::string  getUrl() { return mUrl; }
    int getSelectedLevel() { return mSelectedLevel; }


protected:
    std::string mUrl;
    int mSelectedLevel;

};

//PrefetchTask.cpp
#include <cstdint>
#include <memory>
#include "PrefetchTask.h"


PrefetchTask::PrefetchTask() : mSelectedLevel(0) {};

PrefetchTask::PrefetchTask(const std::string& url, int selectedLevel)
    : mUrl(url)
    , mSelectedLevel(selectedLevel) {};


PrefetchTask::~PrefetchTask() {}

std::shared_ptr<PrefetchTask> prefetchVideoTask = std::make_shared<PrefetchTask>();

void PrefetchTask::execute() {
    mSelectedLevel = getDownloadLevel(mUrl);
    abr::ABRUtils::activateNewTask(prefetchVideoTask , true);
    //主要是是想通过activateNewTask函数,把prefetchVideoTask的数据发送给ABRUtils

}
/
//#include "ABRUtils.h"

#pragma once
#include "PrefetchTask.h"
//...

static inline void activateNewTask(std::shared_ptr<PrefetchTask>& task, bool isPrefetch) {
    std::string url = task->getUrl();
    int Level       = task->getSelectedLevel();
    //...
       
}

试试这个:

static inline void activateNewTask(std::shared_ptr<PrefetchTask>& task, bool isPrefetch) {
    std::string url = task->getUrl();
    int Level = task->getSelectedLevel();
    //...

}


  • 这篇博客: c++学习——动态内存管理中的 2.2.4 std::make_shared 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <iostream>
    #include<memory>
    
    int main()
    {
    	std::shared_ptr<int> ptr(new int (2));
    	std::shared_ptr<int> ptr = std::make_shared<int>(2);
    	auto ptr = std::make_shared<int>(2);
        //三种方式一样 提升构造性能
    }
    

错误指示是无法构造对象,看下你那个虚拟析构函数是否有定义.有可能是有虚拟函数无定义导致

你那个引用作为实参看着不太对头,改指针看看

根据报错信息,问题出在以下代码中:

std::shared_ptr<PrefetchTask> prefetchVideoTask = std::make_shared<PrefetchTask>();

报错信息显示,PrefetchTask 类无法通过 make_shared 构造。这通常是由于类的构造函数不可访问或不可用所导致的。

在你的代码中,PrefetchTask 类的构造函数是公共的,所以问题可能出在其他地方。请检查以下几个可能的原因:

  1. 检查 PrefetchTask 类的头文件 PrefetchTask.h 是否正确引入,并且没有其他定义或声明与之冲突。
  2. 检查 PrefetchTask 类的源文件 PrefetchTask.cpp 是否正确实现,并且没有其他定义或声明与之冲突。
  3. 确保 PrefetchTask 类的构造函数没有被标记为 privateprotected,并且没有其他限制条件导致无法访问。
  4. 如果 PrefetchTask 类在其他地方有继承,确保派生类的构造函数正确调用基类的构造函数。

如果以上步骤都没有解决问题,请提供 PrefetchTask 类的完整代码,以便进一步排查错误。

c++ - 尝试创建 shared_ptr 时 std::make_shared() 出错?以及解决方法
https://www.coder.work/article/1989334


根据您提供的信息,这个错误是由于在使用  `std::make_shared`  函数时,无法构造  `PrefetchTask`  对象而导致的。这个错误信息中的  `static_assert`  表明了在编译期间就发现了无法构造对象的问题,而不是在运行时才发现的。这可能是因为  `PrefetchTask`  类没有提供默认构造函数,或者提供的构造函数参数不符合要求。您可以检查一下  `PrefetchTask`  类的定义,看看是否有这样的问题。

这个错误应该是在std::make_shared();这一行执行的时候就出现问题了。std::make_shared尝试访问PrefetchTask的构造函数,这样的写法是不允许的,你尝试将
std::shared_ptr prefetchVideoTask = std::make_shared()
修改为:
std::shared_ptr prefetchVideoTask = std::shared_ptr();
看下是否可行。或者可以将构造函数私有化来避免这种错误。

因为PrefetchTask类不可复制或构造函数不可用,所以在使用std::make_shared时无法构造出PrefetchTask类的对象

检查类构造函数的参数对不对,确保没有任何参数不匹配或类型不匹配