调用unique_ptr子类

时间:2015-10-29 15:13:44

标签: c++ templates inheritance constructor

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

具体是关于在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,但我很想知道我的尝试有什么问题。

当然,在现实生活中,它不是int*我试图包裹unique_ptr,而是一些不透明(但不是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));

1 个答案:

答案 0 :(得分:5)

std::unique<int>int s的智能指针,即替换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