Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用ostream打印,但可以使用cout打印?_C++_Polymorphism_Protected_Ostream - Fatal编程技术网

C++ 无法使用ostream打印,但可以使用cout打印?

C++ 无法使用ostream打印,但可以使用cout打印?,c++,polymorphism,protected,ostream,C++,Polymorphism,Protected,Ostream,下面是示例代码: object o1(//parameters); object o2(//parameters); object o3(//parameters); object *v[3]; using std::cout; //video output ofstream of; //save on file //let's suppose v[0]=&o1; v[1]=&o2; v[2]=&o3; for (int i=0;i<3;i++) {

下面是示例代码:

object o1(//parameters);
object o2(//parameters);
object o3(//parameters);
object *v[3];

using std::cout; //video output
ofstream of;     //save on file

//let's suppose

v[0]=&o1;
v[1]=&o2;
v[2]=&o3;
for (int i=0;i<3;i++) {
    v[i]->view(cout);
    v[i]->save(of);
}
对象o1(//参数); 对象o2(//参数); 对象o3(//参数); 对象*v[3]; 使用std::cout//视频输出 流的//存档 //让我们假设 v[0]=&o1; v[1]=&o2; v[2]=&o3; for(int i=0;iview(cout); v[i]>保存(of); } view函数只是类的参数的视频打印函数,而save函数将类的参数保存在文件中。问题是,如果我声明
std::ostream;
ostream os;
为什么我不能使用
v[i]->view(os)
进行视频输出?如果我使用
v[i]->view(os)
它会说:

“std::basic_ostream::basic_ostream()[带_CharT=char;_Traits=std::char_Traits]”受保护

虽然对于视频输出来说是这样,但对于保存功能来说却不是这样,它可以正常工作,正如代码中所预期的那样。有人能解释一下吗?如果我把它写得太长了,很抱歉

问题: 1) 如果
视图
功能定义为:

void view(std::ostream output, std::string text) // (1)
{
    output << text;
}
然后编译器会给出一条错误消息:

在MSVC中:

错误C2280:'std::basic_ostream::basic_ostream(const std::basic_ostream&'):尝试引用已删除的函数

通用条款:

错误:使用删除的函数“std::basic\u ostream::basic\u ostream(const std::basic\u ostream&)[带_CharT=char;_Traits=std::char\u Traits]”

叮当声:

错误:调用“std::ostream”(又名“basic_ostream”)的已删除构造函数


2) 为了宣言

std::ostream os;
将显示以下错误消息:

MSVC:

错误C2512:'std::basic_ostream':没有合适的默认构造函数可用

通用条款:

错误:“std::basic_ostream::basic_ostream()[with _CharT=char;_Traits=std::char_Traits]”在此上下文中受保护

叮当声:

错误:调用类“std::basic\u ostream”的受保护构造函数


原因是: 这一切都是按照

默认构造函数没有定义-因此,如果没有特定的构造函数参数,则无法创建类型为
std::ostream
的变量

和C++引用有关:

复制构造函数受到保护,并被删除。输出流不可复制


说明: 1) 因此,问题是在
(2)
中,参数
std::cout
被传递给
(1)
中定义的函数,以将
std::ostream
复制到变量
输出

但是该类的定义表示不能使用复制构造函数,因此编译器会给出错误消息

2) 在创建变量
os
的情况下,它没有给出任何构造函数参数,没有默认构造函数,因此编译器会给出错误消息


如何解决这个问题? 1) 在函数声明中,更改定义,将
std::ostream
的引用(
&
)作为参数:

void view(std::ostream& output, std::string text) // (1)
这允许它使用原始对象而不是复制(不允许复制)


2) 如果需要变量,则还应使用引用

std::ostream& out = std::cout;

我们是否可以看到不起作用的代码,包括如何定义
视图
(请)?您显示的代码中没有提到
std::ostream
。错误消息来自其他代码。把密码贴出来。但从描述上看,问题相当清楚
std::ostream
旨在用作输出流的基类<代码>标准::ostream操作系统不打算工作,编译器正确地抱怨。
std::ostream
只是一个接口类,您需要一个子类(例如流的
ostringstream
)来做一些有用的事情。您得到的错误是,只有子类才能调用
ostream
构造函数,提示“查找子类”。顺便说一句,std::cout
的可能重复项是
ostream
std::ostream& out = std::cout;