正在调用unique_ptr子类的继承模板构造函数
Calling inherited template constructor of unique_ptr subclass
这不是关于模板构造函数甚至调用继承模板构造函数的问题的重复。
它特别是关于在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.
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- C++继承:构造函数中的字符串构造
- 继承构造函数和其他变量的解决方法
- 带有此指针的模板类多重继承构造函数不起作用?
- 虚拟继承构造函数的组装
- C++继承构造函数的可见性
- 继承构造函数(ISO 2011 SEC 12.9第7段)
- 没有C 11的继承构造函数
- 使用关键字继承构造函数时出乎意料的行为
- 继承构造函数不允许类似数组的初始化
- 从基于QObject的类继承构造函数
- 继承构造函数并提供新的重载:无参数基构造函数似乎不参与重载解析
- C++多继承构造函数
- 具有独占继承构造函数的类的值初始化
- C++ 继承构造函数重写
- 继承构造函数与转发
- 默认情况下继承构造函数 noexcept(true)
- 有没有办法在继承构造函数时访问初始值设定项列表
- 从 std::function 继承构造函数时"function returning a function"