正在调用unique_ptr子类的继承模板构造函数

Calling inherited template constructor of unique_ptr subclass

本文关键字:继承 构造函数 子类 ptr 调用 unique      更新时间:2023-10-16

这不是关于模板构造函数甚至调用继承模板构造函数的问题的重复。

它特别是关于在unique_ptr<…,…>的类实例(?)的子类中调用继承的构造函数样板

问题

为了使代码更容易理解,我在本例中使用using

using B = std::unique_ptr<int *, decltype(&::free)>;
class int_ptr : public B {
    int_ptr(int *b) : B(b, &::free) { };
};

但编译失败:

In constructor 'int_ptr::int_ptr(int*)':
error: no matching function for call to 
    'std::unique_ptr<int*, void (*)(void*) throw ()>::unique_ptr(int*&, void (*)(void*) throw ())'
int_ptr(int *b) : B(b, &::free) { };
                              ^

我能想到的缺乏函数匹配的唯一可能原因是throw ()的存在,但我不知道该怎么办,或者它是否是一个问题。unique_ptr可能没有投掷。

否则,无匹配函数正是我所期望的匹配函数。


原因

我不想每次声明unique_ptr的实例时都指定析构函数。这个答案有一个很好的替代方案https://stackoverflow.com/a/16615285/2332068,但我很想知道我的尝试出了什么问题。

当然,在现实生活中,我试图用unique_ptr包装的不是int*,而是一些不透明的(但不是void*)指针。

我的意图是在作用域退出时,正确释放C API中的所有指针。

也许我可以用析构函数将这些指针约束到类/结构中,但我看不出这会节省多少。

结果

根据@RSahu的提示,我提出了unique_dptr,以避免不断指定析构函数,但作为覆盖std命名空间中模板删除函数的替代方案:

void free_int(int* p) {
  delete p;
}
template<typename T, void (*D)(T*)>
class unique_dptr : public std::unique_ptr<T, decltype(D)> {
    public: unique_dptr(T* t) : std::unique_ptr<T, decltype(D)>(t, D) { };
};
using int_ptr = unique_dptr<int, ::free_int>;
int_ptr i(new int(2));

std::unique<int>int的智能指针,即int*的替代品。

使用std::unique<int*>时,指针需要为int**

代替

using B = std::unique_ptr<int *, decltype(&::free)>;

使用

using B = std::unique_ptr<int, decltype(&::free)>;

工作代码(谢谢,@CompuChip):http://ideone.com/ul29vr.