这不是关于模板构造函数甚至调用继承的模板构造函数的问题的重复。
它具体是关于在 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 中的所有这些指针。
也许我可以用析构函数将这些指针限制到一个类/结构中,但我看不出它会节省多少。
Result
根据@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));