英文:
How can I inherit all the unique_ptr<T[]> constructors?
问题
以下是您提供的代码的翻译:
我正在尝试继承 unique_ptr<T[]>,只是为了添加一个使用 malloc 分配数组并设置一个 const 大小字段的构造函数。
#include <memory>
#include <functional>
using std::function;
using std::unique_ptr;
using std::byte;
template<class _Tp, class _Dp = function<void(_Tp*)>>
class unique_array_ptr : public unique_ptr<_Tp[], _Dp> {
public:
using unique_ptr<_Tp[], _Dp>::unique_ptr;
unique_array_ptr(const size_t size) : unique_ptr<_Tp[], _Dp>((_Tp*) malloc(size), free), size(size) {}
const size_t size;
};
void move() {
unique_ptr<byte> hello(new byte[5]);
unique_array_ptr<byte> test = std::move(hello);
}
测试赋值触发了以下错误:
<source>: 在函数‘void move()’中:
<source>:18:44: 错误:请求将非标量类型‘std::unique_ptr<std::byte>’转换为‘unique_array_ptr<std::byte>’
18 | unique_array_ptr<byte> test = std::move(hello);
| ~~~~~~~~~^~~~~~~
在有人建议使用 std::vector 之前,请注意,我正在使用一个 C 库,因此需要能够传递它可以稍后释放的缓冲区。
我尝试使用 using unique_ptr<_Tp[], _Dp>::unique_ptr;
继承构造函数,但似乎有些问题。
更新:
我将代码更改为以下形式,但仍然得到“无法转换”的错误:
unique_ptr<byte[], function<void(byte*)>> hello(new byte[5]);
unique_array_ptr<byte> test = std::move(hello);
英文:
I'm trying to inherit unique_ptr<T[]> just to add a constructor which allocates the array using malloc and sets a const size field.
#include <memory>
#include <functional>
using std::function;
using std::unique_ptr;
using std::byte;
template<class _Tp, class _Dp = function<void(_Tp*)>>
class unique_array_ptr : public unique_ptr<_Tp[], _Dp> {
public:
using unique_ptr<_Tp[], _Dp>::unique_ptr;
unique_array_ptr(const size_t size) : unique_ptr<_Tp[], _Dp>((_Tp*) malloc(size), free), size(size) {}
const size_t size;
};
void move() {
unique_ptr<byte> hello(new byte[5]);
unique_array_ptr<byte> test = std::move(hello);
}
The test assignment triggers this error:
<source>: In function 'void move()':
<source>:18:44: error: conversion from 'std::remove_reference<std::unique_ptr<std::byte>&>::type' {aka 'std::unique_ptr<std::byte>'} to non-scalar type 'unique_array_ptr<std::byte>' requested
18 | unique_array_ptr<byte> test = std::move(hello);
| ~~~~~~~~~^~~~~~~
Also before anyone says just use std::vector, I'm working with a C library so I need to be able to pass in buffers that it can free later.
I tried to inherit the constructors with using unique_ptr<_Tp[], _Dp>::unique_ptr;
but something isn't working.
Update:
I changed it to this but I still get no viable conversion.
unique_ptr<byte[], function<void(byte*)>> hello(new byte[5]);
unique_array_ptr<byte> test = std::move(hello);
答案1
得分: 2
This isn't a unique_ptr<byte[], function<void(_Tp*)>>
, but a unique_ptr<byte, default_delete<byte>>
, so no reason why it would be interoperable with your class.
英文:
> unique_ptr<byte> hello(new byte[5]);
This isn't a unique_ptr<byte[], function<void(_Tp*)>>
, but a unique_ptr<byte, default_delete<byte>>
, so no reason why it would be interoperable with your class.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论