关于boost::bind中fstream对象禁止拷贝的解决方法
2015-10-16 11:09
232 查看
fstream的拷贝构造函数是私有的,禁止fstream对象的拷贝。
比如,下面的程序编译出错,提示拷贝构造函数私有:
编译结果:
在上述代码中,如果将coutt参数改为其他的非对象参数或者自己定义的对象都不会发生这个问题。
解决办法是用std::ref(或者boost::ref)将fstream对象包装。改过后的代码如下:
再次编译,可以通过。
注意:使用std::ref需要包含头文件#include<functional>
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const 引用传递的值。
参考:http://www.cppblog.com/everett/archive/2012/12/03/195939.html
比如,下面的程序编译出错,提示拷贝构造函数私有:
#include<fstream> #include<iostream> #include<boost/thread/thread.hpp> using namespace std; void fun(ofstream &out) { std::cout<<"succeed!"<<endl; } int main(){ ofstream coutt("a.txt"); fun(coutt); boost::bind(&fun,coutt); }
编译结果:
在上述代码中,如果将coutt参数改为其他的非对象参数或者自己定义的对象都不会发生这个问题。
解决办法是用std::ref(或者boost::ref)将fstream对象包装。改过后的代码如下:
#include<fstream> #include<iostream> #include<boost/thread/thread.hpp> #include<boost/bind.hpp> using namespace std; void fun(ofstream &out) { std::cout<<"succeed!"<<endl; } int main(){ ofstream coutt("a.txt"); fun(coutt); boost::bind(&fun,boost::ref(coutt)); }
再次编译,可以通过。
注意:使用std::ref需要包含头文件#include<functional>
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const 引用传递的值。
参考:http://www.cppblog.com/everett/archive/2012/12/03/195939.html
相关文章推荐
- 程序与自动机及静态分析杂想
- C#中关于Gridview的一些属性(二、绑定数据)
- 定制Android系统开发之二——系统服务
- 开博大吉
- maven 工程把依赖包打入jar包
- ueditor编辑器设置限制字数
- [算法也疯狂]实现假装商品抢购繁忙的效果(php版)
- [算法也疯狂]实现假装商品抢购繁忙的效果(php版)
- SpringMVC 多控制器,静态资源访问,配置文件位置更改
- 文档视图结构
- Android KITKAT 以上实现translucent状态栏
- 局部性
- mongostat详解
- ASP.NET缓存中Cache过期的三种策略
- [No00001C]不想背单词患者的福音!-快来定制你的个性词包-不想记、记不牢,这可怎么办?
- netstat miscellaneousness
- Java实现给定任一字符串,长度为任意,要求找出其出现次数最多的字符及其出现次数。
- java中final的作用
- ArcGIS Runtime加载本地Shape数据和编辑Shape数据
- const限定符修饰的常量变量能否作为数组声明的维度、case行标或其他类似场景?