我无法将对
std::ostream
的引用传递给类构造函数并将其分配给引用成员变量。
我有两个文件:
// ./include/HelloWorld.hpp
#ifndef __HELLOWORLD_H__
#define __HELLOWORLD_H__
#include <iostream>
#include<string>
class HelloWorld {
public:
HelloWorld(std::ostream& MyOut);
void say();
private:
std::ostream &output;
};
#endif
// ./src/HelloWorld.cpp
#include "../include/HelloWorld.hpp"
HelloWorld::HelloWorld(std::ostream &MyOut) : output(MyOut){
output = MyOut; // Error is thrown here
};
void HelloWorld::say(){
this->output << "Hello World4!" << '\n';
}
当我跑步时:
g++ -c -fPIC -Wall -Werror -o bin/HelloWorld.o src/HelloWorld.cpp
我收到以下错误:
src/HelloWorld.cpp: In constructor ‘HelloWorld::HelloWorld(std::ostream&)’:
src/HelloWorld.cpp:5:14: error: use of deleted function ‘std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator=(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’
5 | output = MyOut; // Error is thrown here
| ^~~~~
In file included from /usr/include/c++/9/iostream:39,
from src/../include/HelloWorld.hpp:5,
from src/HelloWorld.cpp:2:
/usr/include/c++/9/ostream:405:22: note: declared here
405 | basic_ostream& operator=(const basic_ostream&) = delete;
| ^~~~~~~~
由于这个问题,我假设我没有将引用分配给引用。但是,据我了解,我相信成员变量和构造函数参数都被定义为引用。
我在这里误解了什么?
这里
HelloWorld::HelloWorld(std::ostream &MyOut) : output(MyOut){ // I
output = MyOut; // Error is thrown here
};
您从初始化器列表中的
output
正确初始化了成员引用 MyOut
。 I
然后,
II
,尝试将MyOut
分配给output
,这两者都是对同一个ostream的引用。如果可以编译,它将什么也不做,因为它尝试将相同的 ostream 分配给自己。但是,无法分配或复制 std::ostream
,这就是您收到错误的原因。
解决方案是在成员初始值设定项列表中初始化该成员,而不是在构造函数体内对其进行赋值:
HelloWorld::HelloWorld(std::ostream &MyOut) : output(MyOut) {}