C++编译错误:call to deleted constructor of 'std::istream' (aka 'basic_istream')

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uestcyms/article/details/88286397

call to deleted constructor of ‘std::istream’ (aka ‘basic_istream’)

示例代码

#include<iostream>
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<char>]’ is protected
       basic_istream(const basic_istream&) = delete;
       ^
main.cpp:27:23: error: within this context
     std::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<char>]’
In file included from /usr/include/c++/5/iostream:40:0,
                 from main.cpp:8:
/usr/include/c++/5/istream:611:7: note: declared here
       basic_istream(const basic_istream&) = delete;

分析:

  1. 对象赋值时是调用拷贝构造函数进行赋值的
#include<iostream>
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;
``

猜你喜欢

转载自blog.csdn.net/uestcyms/article/details/88286397