关于boost::bind中fstream对象禁止拷贝的解决方法

简介:

fstream的拷贝构造函数是私有的,禁止fstream对象的拷贝。

比如,下面的程序编译出错,提示拷贝构造函数私有:

#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


目录
相关文章
|
7月前
|
编译器 C++
02头文件的冲突导致,清除缓冲区失败之cin.ignore() 问题
输入任意多个整数, 把这些数据保存到文件data.txt中. 如果在输入的过程中, 输入错误, 则提示用户重新输入. 指导用户输入结束(按ctrl + z) [每行最多保存4个整数] 可能遇到的 cin.ignore();问题
64 0
|
6月前
|
编译器 Shell C++
在编译的两个.o文件中有对同一个头文件的引用,因此在链接时出现结构体重复定义的问题怎么解决
在编译的两个.o文件中有对同一个头文件的引用,因此在链接时出现结构体重复定义的问题怎么解决
158 2
|
编译器
引用头文件的操作
引用头文件的操作。
47 0
Qt 之未定义标识符“qFlagLocation“解决办法
Qt 之未定义标识符“qFlagLocation“解决办法
|
7月前
|
C++
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
129 0
|
Linux 编译器 C语言
Linux环境下gcc编译过程中找不到名为pthread_create的函数的定义:undefined reference to `pthread_create‘
Linux环境下gcc编译过程中找不到名为pthread_create的函数的定义:undefined reference to `pthread_create‘
203 0
普通函数中的this指向问题解决方案bind
普通函数中的this指向问题解决方案bind
48 0
|
C++
库、dlopen、函数名都正确,dlsym出错了,怎么回事
库、dlopen、函数名都正确,dlsym出错了,怎么回事
137 0
编译OpenJDK12:freetypeScaler.obj error LINK2019 无法解析的外部符号
编译OpenJDK12:freetypeScaler.obj error LINK2019 无法解析的外部符号
98 0
解决办法:对‘operator delete(void*)’未定义的引用
解决办法:对‘operator delete(void*)’未定义的引用
198 0