#代码报错
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();
//...
}
#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
类的构造函数是公共的,所以问题可能出在其他地方。请检查以下几个可能的原因:
PrefetchTask
类的头文件 PrefetchTask.h
是否正确引入,并且没有其他定义或声明与之冲突。PrefetchTask
类的源文件 PrefetchTask.cpp
是否正确实现,并且没有其他定义或声明与之冲突。PrefetchTask
类的构造函数没有被标记为 private
或 protected
,并且没有其他限制条件导致无法访问。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类的对象
检查类构造函数的参数对不对,确保没有任何参数不匹配或类型不匹配