Alc*_*ott 2 c++ iostream initializer-list
iostream和其他流类实际上不是类,但typedefs,对吗?
这是问题所在,我试图istream在初始化列表中初始化一个对象,但不幸的是我收到了一个错误,代码如下:
class A
{
public:
A(istream &is=cin): ais(is)
{}
private:
istream ais;
};
Run Code Online (Sandbox Code Playgroud)
无法用g ++编译,错误:
synthesized method ‘std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)’ first required here
Run Code Online (Sandbox Code Playgroud)
我搜索了SO,发现了,iostream cannot be assigned or copy.但为什么我不能在初始化列表中初始化它?
我想,初始化列表会调用对象的构造函数/ copy-constructor,对吧?
您的代码尝试将一个istream(传递给构造函数的代码)转换为两个istreams,即传递给构造函数的s和ais.一个istream对象代表实际流本身.只有一个流,并且无法以某种方式将其转换为两个流.
甚至不清楚这意味着什么.如果流上有一些数据,那么先读取哪个数据流得到它?或者他们都得到了吗?如果是这样,谁或什么重复呢?
An istream就像一个文件本身.如果不将数据从一个文件复制到另一个文件,则无法将一个文件转换为两个文件.但是,您可以根据需要使用相同数量的引用或指针istream.您的问题的解决方案可能是作出ais参考.
您将成员变量声明为:
istream ais;
Run Code Online (Sandbox Code Playgroud)
这意味着将在初始化列表中调用复制构造函数。这不是特定于初始值设定项列表的:您不能在任何地方执行此操作。
您可以将成员变量更改为引用:
istream& ais;
Run Code Online (Sandbox Code Playgroud)
但这意味着您必须确保引用的istreamto 在 的ais生命周期内有效A。
| 归档时间: |
|
| 查看次数: |
4953 次 |
| 最近记录: |