C++编译错误:call to deleted constructor of std::istream
call to deleted constructor of ‘std::istream’ (aka ‘basic_istream’)
示例代码
#include
using namespace std;int main()
{std::istream is = cin; //出错代码return 0;
}
编译代码详细错误如下(g++ main.cpp --std=c++11 -o main):
In file included from /usr/include/c++/5/iostream:40:0,from main.cpp:8:
/usr/include/c++/5/istream: In function ‘int main()’:
/usr/include/c++/5/istream:611:7: error: ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits]’ is protectedbasic_istream(const basic_istream&) = delete;^
main.cpp:27:23: error: within this contextstd::istream is = cin;^
main.cpp:27:23: error: use of deleted function ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits]’
In file included from /usr/include/c++/5/iostream:40:0,from main.cpp:8:
/usr/include/c++/5/istream:611:7: note: declared herebasic_istream(const basic_istream&) = delete;
分析:
- 对象赋值时是调用拷贝构造函数进行赋值的
#include
using namespace std;class Demo {
public:Demo(int i) {number = i;cout << "Demo constructor" << endl;}Demo(const Demo &demo) {number = demo.number;cout << "copy constructor" << endl;}int geti(){return number;}
private:int number;
};int main() {Demo d(1);Demo d2 = d;cout << d2.geti() << endl;return 0;
}
输出结果:
Demo constructor
copy contuctor
1
所以出错代码std::istream is = cin; 隐藏调用了istream的拷贝函数。
2. istream的拷贝函数
由于istream的拷贝函数是protected(只能给子类调用),无法调用,所以出错。
解决:
针对这种问题,可使用下面代码替换,使用引用来达到效果。
std::istream& is = cin;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
