今天写C++ Primer Plus17章的最后一题,要构造一个Store函数符来将vector中的string对象写入文件,但是写好后编译器一直报错

1
std::ios_base::ios_base(const std::ios_base&) is private

看样子是标准库里面的报错,我写的Store类如下

1
2
3
4
5
6
7
8
9
10
// functor Store
class Store
{
private:
std::ostream os;
public:
Store(std::ostream & o) : os(o) {}
// overloaded funtions
void operator()(const std::string & s);
};

报错里面说ios_base的复制构造函数是私有的,我好像在哪里见过。。。然后就想到了在讨论C++函数返回值时候关于返回非const引用中有说cout对象没有公共的复制构造函数因此不能返回对象,返回对象要创建临时对象,这样会调用复制构造函数,然而ios_base类(包括他的子类iostream…)没有公开他的复制构造函数于是外部不能调用,自然会报错了。
需要将std::ostream os改成std::ostream & os

同样我这里也是这个问题,我在Store类中将os变量声明为ostream而不是其引用,这样我在Store的构造函数中会初始化这个成员,自然会调用os对象的复制构造函数,这个错误也就会报出来了。
因此以后要使用ios_base类的时候一定要注意声明称引用

Comments

2016-03-16