shared_ptr的模版推导问题
来源:互联网 发布:mac的dns怎么设置最快 编辑:程序博客网 时间:2024/06/06 08:26
问题描述
今天在帮同事解决问题时,发现了这个比较有意思的现象,特记录下来备忘。
问题是这样的,同事开发的是应用程序动态库模块,通过应用的框架中以接口方式供外部使用。然后他想对这些接口生命周期进行控制,从语法角度上约束使用者使用的手段。因此他作出了以下修改:
1.增加接口的析构函数,并将析构函数设定为保护级别
2.返回接口的函数用shared_ptr的形式返回
具体代码示例
// 测试接口struct IAA{ virtual void Release() = 0;protected: virtual ~IAA(){}};// 对象删除器struct HelpDeleteIAA{ void operator()(IAA* pAA) { if (NULL!=pAA) { pAA->Release(); } }};class CAA : public IAA{public: CAA() { } virtual ~CAA() { } virtual void Release() { delete this; }};typedef std::tr1::shared_ptr<IAA> SPIAA;// 测试创建SPIAA helpIAA(bool bFlag){ if (bFlag) { return SPIAA(new CAA, HelpDeleteIAA()); } return SPIAA(static_cast<IAA*>(NULL));}int main(){ SPIAA spAA = helpIAA(); // 测试使用 return 0;}写完以后兴冲冲的一编译,傻眼了,提示是不能访问IAA::~IAA()的析构接口。可是在代码中明显指定了删除器啊?百思不得其解。。。
问题原因分析
经过调试后发现问题出现在helpIAA()的函数中,由于智能指针shared_ptr()是一个模版,满足模版推导的过程,而在helpIAA()函数中用到了两种函数构造原型,猜测可能是编译过程中对该模版推导顺序影响了最后产生的结果。
解决方案
将helpIAA()函数的返回代码
return SPIAA(static_cast<IAA*>(NULL));修改为
return SPIAA(static_cast<IAA*>(NULL), HelpDeleteIAA());
然后执行编译,编译器顺利编译通过了。
总结
以上的问题原因推断只是我个人的一点看法,如果不正确的地方欢迎各位斧正。
0 0
- shared_ptr的模版推导问题
- 浅谈shared_ptr及shared_ptr涉及到的循环引用问题
- 模版类型推导
- shared_ptr跨模块边界的问题
- shared_ptr产生的循环引用问题
- VC的类型推导问题
- 关于模版的一个问题
- 使用thymeleaf模版的问题
- shared_ptr 相关问题
- shared_ptr相互引用问题
- shared_ptr循环引用问题
- shared_ptr循环引用问题
- shared_ptr 循环引用问题
- shared_ptr循环引用问题
- 投影矩阵推导遇到的问题
- 字符串参数的模板函数推导问题
- 约瑟夫环问题映射关系的推导
- 约瑟夫环问题的公式推导
- 黑马程序员----break,continue,函数(方法,第五天学习笔记
- 用Shell脚本过滤Hadoop中不能访问的节点
- 关于使用cxf做webservice的简单例子
- 安装openstack提示需求python-six >= 1.6问题解决
- 上海地铁一日券
- shared_ptr的模版推导问题
- 用BOOST_FOREACH简化遍历操作
- Elasticsearch基础教程
- hdu 4081 次小生成树
- LinkedList源码阅读
- js传统方式取数字
- 傅里叶变换简单理解
- CMDeviceMotion
- js传统方式取数字