首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

调用operator<<重载时出现的std::__1::ostream错误的已删除构造函数

是由于在重载operator<<时,可能会遇到std::__1::ostream类的已删除构造函数的错误。这个错误通常是由于尝试使用已删除的构造函数来创建std::__1::ostream对象引起的。

std::__1::ostream是C++标准库中用于输出的类,它是std::basic_ostream类的一个特化版本。在C++中,我们可以通过重载operator<<来自定义输出操作符,以便将自定义类型的对象输出到std::__1::ostream对象中。

然而,当我们在重载operator<<时,如果我们尝试使用已删除的构造函数来创建std::__1::ostream对象,就会导致这个错误。已删除的构造函数是指在类定义中使用了delete关键字标记的构造函数,这意味着该构造函数不能被调用。

要解决这个错误,我们需要确保在重载operator<<时,使用的std::__1::ostream对象是有效的。可以通过以下几种方式来避免这个错误:

  1. 确保使用有效的std::__1::ostream对象:在重载operator<<时,确保使用的std::__1::ostream对象是有效的,即已经通过合法的方式创建了该对象。可以通过传递一个有效的std::__1::ostream对象作为参数,或者在函数内部创建一个有效的std::__1::ostream对象。
  2. 检查std::__1::ostream对象的构造函数:如果在重载operator<<时仍然遇到这个错误,可以检查std::__1::ostream类的构造函数是否被删除或者不可访问。如果是这种情况,可以尝试使用其他可用的构造函数或者创建一个派生类来解决这个问题。
  3. 检查operator<<的参数类型:确保在重载operator<<时,参数的类型与预期的类型匹配。如果参数类型不匹配,可能会导致编译器选择错误的重载函数,从而引发错误。

总结起来,当调用operator<<重载时出现std::__1::ostream错误的已删除构造函数,我们需要确保使用的std::__1::ostream对象是有效的,并且检查构造函数和参数类型是否正确。如果仍然无法解决问题,可能需要进一步检查代码逻辑和调试错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】泛型编程 ⑩ ( 类模板运算符重载 - 函数实现 写在类外部同一个 cpp 代码中 | 类模板 外部友元函数二次编译问题 )

, 只有在 重载 左移 右移 操作符 , 才使用 友元函数 ; ( 1 ) 错误示例及分析 - 类模板 外部友元函数 二次编译 问题 在 类模板 内部声明 友元函数 , template <typename...& s) { out << "a:" << s.a << " b: " << s.b << endl; return out; } 运行时会报如下错误 : 启动生成… 1>------ 启动生成...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 造成上述错误原因 就是 函数模板 实现机制 中 二次编译 有关 , 第一次编译 函数模板...( 2 ) 正确写法 友元函数 不要乱用 , 只有在 重载 左移 右移 操作符 , 才使用 友元函数 ; 这是 函数模板 二次编译 问题 , 一般情况下 , 函数模板 只有在 调用时 , 才需要将...operator (ostream& out, Student& s); public: // 构造函数 Student(T x, T y); // 重载 + 运算符 Student

17610

C++拾趣——有趣操作符重载

sample.operator++(10);         再回到之前面试题,如果面试官询问++sample和sample++哪个效率高些,你则可以告知是前置高些,因为后置方式使用了拷贝构造函数构造了一个临时对象..._m); }         上面例子第14行是加法成员函数重载,第33行是友元式重载。         这两种实现是有区别的,区别就是对隐式构造函数处理。        ...这样编译器会将2隐式构造成一个Sample临时对象(调用Sample(int n)构造函数)。        ..._m); }         但是不是所有重载都可以设置为成员函数形式,比如上面例子中频繁出现<<重载。...11行,第10行调用方式更像普通函数调用,但是它有一个缺点:需要显式申明一个函数对象。

77530

C++:12---运算符重载

,否则返回是一个临时对象 如果没有写赋值重载运算符,编译器自动存在一个默认,就是拷贝构造中所用到默认拷贝构造,但是如果类成员变量中含有动态内存变量,需要重载赋值运算符 class Cperson...八、 >>、<<运算符重载 输入输出运算符重载不能用成员函数实现,一般用友元实现 重载输出运算符<< 参数: 参数1:一个非常量ostream对象引用(ostream是非常量是因为向流写入内容会改变其状态...这些指针是行为与正常指针相似的对象,唯一不同是,当您通过指针访问对象,它们会执行其他任务。比如,当指针销毁,或者当指针指向另一个对象,会自动删除对象。...sp->g(); } while(sp++); return 0; } 十一、()函数调用运算符重载 如果类重载函数调用运算符,那么我们在使用该对象就如同调用一个函数一样...注意:()运算符与对象初始化时调用构造函数不是一个东西、因此()函数调用运算符不能再类初始化时使用,会与构造函数冲突 struct absInt { bool operator()(int value

58430

C++初阶类与对象(三):详解复制构造函数和运算符重载

取地址操作符重载 1.拷贝构造函数 1.1引入和概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用存在类类型对象创建新对象由编译器自动调用(是构造函数重载...) 拷贝构造函数典型调用场景(自动调用): 使用存在对象创建新对象 函数参数类型为类类型对象 函数返回值类型为类类型对象 之前在c语言实现各种数据结构,我们都会传入结构体指针(也可以传入值,...(st1); return 0; } 拷贝构造函数典型调用场景: 使用存在对象创建新对象 函数参数类型为类类型对象 函数返回值类型为类类型对象 2.赋值运算符重载 2.1运算符重载 C++为了增强代码可读性引入了运算符重载...和上面拷贝构造一样:日期类这样是不需要实现(使用默认就够了);但是像是Stack类这样一旦涉及到资源申请,则拷贝构造函数是一定要写(要用深拷贝) 赋值运算符重载与拷贝构造调用区别: int...main() { Date d1;//调用构造函数 Date d2 = d1;//这是调用拷贝构造; //一个已经存在对象,拷贝初始化另一个要创建对象拷贝构造 Date d3; d3

15210

【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类私有指针成员 | 为指针分配指定大小内存并初始化 0 )

s1 << endl; ostream& operator<<(ostream& out, String& s) { cout << "调用重载 左移 << 操作符函数 ostream& operator...中实现 String 左移运算符重载 // 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl; ostream& operator<<(ostream&...out, String& s) { cout << "调用重载 左移 << 操作符函数 ostream& operator<<(ostream& out, String& s)" << endl;...main() { // 调用无参构造函数 String s1; // 调用有参构造函数 String s2("Tom"); // 调用拷贝构造函数 String s3 = s2;...// 调用重载等号运算符函数, 右操作数是 String 对象 s1 = s2; // 调用重载等号运算符函数, 右操作数是 字符串常量值 , char* 指针类型 s3 = "Jerry

15010

【C++】泛型编程 ⑪ ( 类模板运算符重载 - 函数实现 写在类外部不同 .h 头文件和 .cpp 代码中 )

; 一、类模板运算符重载 - 函数实现 写在类外部不同 .h 头文件和 .cpp 代码中 1、分离代码 后 友元函数报错信息 - 错误示例 上一篇博客 【C++】泛型编程 ⑩ ( 类模板运算符重载..."pause"); return 0; } 执行报错信息 执行 Test.cpp 中 main 函数 , 报如下错误 : 1>------ 启动生成: 项目: HelloWorld, 配置: Debug...<<@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@AAV?..." using namespace std; template class Student { // 左移运算符重载 friend ostream& operator (ostream& out, Student& s); public: // 构造函数 Student(T x, T y); // 重载 + 运算符 Student operator

20210

C++查缺补漏

内联函数 声明时使用关键字 inline 编译调用处用函数体进行替换,节省了参数传递、控制转移等开销 注意: 内联函数体内不能有循环语句和switch语句 内联函数定义必须出现在内联函数第一次被调用之前...构造函数 默认构造函数 //下面两个都是默认构造函数,如在类中同时出现,将产生编译错误: Clock(); Clock(int newH=0,int newM=0,int newS=0); 隐含生成构造函数...复制构造函数是一种特殊构造函数,其形参为本类对象引用,作用是用一个存在对象去初始化同类型新对象 定义一个对象,以本类另一个对象作为初始值,发生复制构造 如果函数形参是类对象,调用函数...如果未列出,则表示调用该虚基类默认构造函数 在建立对象,只有最远派生类构造函数调用虚基类构造函数,其他类对虚基类构造函数调用被忽略 #include using namespace...• 将<<(双目)重载为非成员函数,并将其声明为复数类友元,它左操作数是std::ostream引用,右操作数为复数类常引用,返回std::ostream引用 #include <iostream

2.5K10

【C++】泛型编程 ⑭ ( 类模板示例 - 数组类模板 | 容器思想 | 自定义类可拷贝 - 深拷贝与浅拷贝 | 自定义类可打印 - 左移运算符重载 )

一、容器思想 1、自定义类可拷贝 - 深拷贝与浅拷贝 上一篇博客 【C++】泛型编程 ⑬ ( 类模板示例 - 数组类模板 | 构造函数和析构函数 声明与实现 | 普通成员函数 声明与实现 | 外部友元函数...动态分配内存 , 如果没有定义 拷贝构造函数 , 默认 拷贝构造函数 是 浅拷贝 函数 , 直接将 指针地址 简单拷贝 , 这就是 不可被拷贝情况 ; 那么多个 数组元素 就会共享 相同 堆内存...数据 , 此时就会出现问题 ; 如果遇到了上述问题 , 定义了 char* m_name 成员变量 , 涉及到 动态分配内存 , 那么 该自定义类 必须自己实现 深拷贝 拷贝构造函数 ; 编写类...: class Student { friend ostream& operator<<(ostream& out, const Student& s); } 实现 左移运算符重载函数 : // 重载左移运算符实现...cout << " 调用析构函数 " << endl; } // 数组下标 [] 操作符重载 template T& Array::operator[](int i)

17610

C++ 运算符重载

因为没有编写复制构造函数,所以一旦出现使用复制构造函数初始化 String 对象(例如,String 对象作为函数形参,或 String 对象作为函数返回值),就可能导致问题。...最简单可能出现问题情况如下:  String s2; s2 = "Transformers"; String s1(s2);  s1 是以 s2 作为实参,调用默认复制构造函数来初始化。...默认复制构造函数使得 s1.str 和 s2.str 指向同一个地方,即执行是浅拷贝,这就导致了前面提到没有对=进行第二次重载产生问题。...有了对 double 运算符重载,在本该出现 double 类型变量或常量地方,如果出现了一个 Complex 类型对象,那么该对象 operator double 成员函数就会被调用,然后取其返回值使用...为了解决这个问题,C++ 规定,在重载++或--,允许写一个增加了无用 int 类型形参版本,编译器处理++或--前置表达式调用参数个数正常重载函数;处理后置表达式调用多出一个参数重载函数

1.2K00

【C++ 初阶路】--- 类和对象(末)

二、再谈构造函数 2.1 构造函数体赋值 在创建对象,编译器通过调用构造函数,给对象中各个成员变量一个合适初始值。...于是找到了对象实例化必须调用构造函数,但如果在构造函数体中的话,可能出现多次初始化情况。 最后规定了初始化列表这一概念!其是每个成员变量定义初始化位置!...友元分为:友元函数和友元类 4.1 友元函数 问题:现在尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数。...//若重载成类成员函数ostream& operator<<(const Date* this, ostream& _cout); // d1 d1.operator<<(...&d1, cout); 不符合常规调用 // 因为成员函数第一个参数一定是隐藏this,所以d1必须放在<<左侧 ostream& operator<<(ostream& _cout) { _cout

6310

C++函数模板(模板函数)详解

编译器在编译到调用函数模板语句,会根据实参类型判断该如何替换模板中类型参数。...: 40 重载左移> 只能用友元函数,其他运算符重载都要用成员函数,不要滥用友元函数 41 */ 42 //ostream & operator<< (ostream &out,...} 2.所有的类模板函数写在类外部,在一个cpp中 注意: 复制代码 //构造函数 没有问题 普通函数 没有问题 友元函数:用友元函数重载 > friend ostream& operator...设计: 类模板 构造函数 拷贝构造函数 << [] 重载=操作符 a2=a1 实现 2) 请仔细思考: a) 如果数组模板类中元素是Teacher元素,需要Teacher类做什么工作...容器执行插入元素操作,内部实施拷贝动作。所以STL容器内存储元素必须能够被拷贝(必须提供拷贝构造函数)。

1.5K40

【C++】string学习 — 手搓string类项目

第二,构造函数,析构函数必须要有的,而且构造函数需要支持多种构造方法(常量字符串,拷贝构造,空类构造)。...流操作符重载 ostream& operator<< (ostream& out, const bit::string& str) { } istream& operator>> (istream...3.1 构造函数 和 析构函数 构造函数我们使用全却省,拷贝构造2个:这里注意初始化列表使用 因为涉及了指针操作,所以必要初始化是十分需要 全缺省构造函数十分好用 //常量字符串构造 string...+ 1) { //调用函数简单完成 strcpy(_str, str); } //拷贝构造 //这里使用到了 = 重载,所以它测试可以等到实现操作符重载之后在实现。...注意这里面 = 重载,现代写法更加简单 只需一步 swap即可。这十分巧妙,通过调用不同函数就帮助我们改善了代码复杂性。

9410

C++ 运算符重载

因为没有编写复制构造函数,所以一旦出现使用复制构造函数初始化 String 对象(例如,String 对象作为函数形参,或 String 对象作为函数返回值),就可能导致问题。...最简单可能出现问题情况如下:  String s2; s2 = "Transformers"; String s1(s2);  s1 是以 s2 作为实参,调用默认复制构造函数来初始化。...默认复制构造函数使得 s1.str 和 s2.str 指向同一个地方,即执行是浅拷贝,这就导致了前面提到没有对=进行第二次重载产生问题。...有了对 double 运算符重载,在本该出现 double 类型变量或常量地方,如果出现了一个 Complex 类型对象,那么该对象 operator double 成员函数就会被调用,然后取其返回值使用...为了解决这个问题,C++ 规定,在重载++或--,允许写一个增加了无用 int 类型形参版本,编译器处理++或--前置表达式调用参数个数正常重载函数;处理后置表达式调用多出一个参数重载函数

1.1K20

大学C++课程提炼概括【C++笔记】

,但普通函数不行; //5)调用友元函数,在实际参数中需要指出要访问对象; #include using namespace std; class Point //Point...:"条件运算符 这五个不可重载 //重载不会改变运算符优先级 //重载双目运算符 "==" ">" "<" //要构建一个String 类,重载函数以友元函数形式出现在类中,双目符重载函数作为成员函数报错...}; //构造函数积累子类调用根据继承顺序调用构造函数,所以构造函数参数表写顺序最好是先写基类再写子类构造函数(就是大括号前面的那几个构造函数) //解释派生构造例子 #include<...中对象,cin是istream中对象 //cerr标准错误流,不经过缓冲区,直接报错误信息 //clog标准错误流,经过缓冲区,缓冲区满或者遇到endl才输出错误信息。...//补充8 delete p; p指向一个对象时候,编译器发出警告,可能会出现未知行为,这时候,构造函数变成虚函数,就不报错了,保证都能删光 //教训9 做对象链表,刚开始四种情况,全用了单链表,

35770

【C++】运算符重载案例 - 字符串类 ④ ( 重载 双等号 == 运算符 | 重载 不等号 != 运算符 | 代码示例 )

=(String& s); // 使用 全局函数 实现 左移运算符 << 重载 // 将全局函数 声明为 String 友元函数 friend ostream& operator<<(ostream...中实现 String 左移运算符重载 // 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl; ostream& operator<<(ostream&...out, String& s) { cout << "调用重载 左移 << 操作符函数 ostream& operator<<(ostream& out, String& s)" << endl;...main() { // 调用无参构造函数 String s1; // 调用有参构造函数 String s2("Tom"); // 调用拷贝构造函数 String s3 = s2;...// 调用重载等号运算符函数, 右操作数是 String 对象 s1 = s2; // 调用重载等号运算符函数, 右操作数是 字符串常量值 , char* 指针类型 s3 = "Jerry

21720

C++中与类有关注意事项(更新中~~~)

,不管它在哪里,记住即可,不过关于对象成员构造函数调用还需注意, 见 L1, L2, L3, 它们构造函数调用次序与它们在此相对次序有关,如类A排在第一行,因此先调用关于它对象,这里还应再注意一点...,不过这根据需要而定,如果你已经设置了无参构造函数了或者你在类内定义了一些set函数),比如调用完基类构造函数后优先调用a0构造函数,但初始化列表中并没有它,故调用默认构造函数,然后调用a4构造函数...类里面的任何成员变量在定义是不能初始化,尽管你可以编译过。 类一个对象调用了一次构造函数之后,是不允许再次调用构造函数。...注意:重载 &s)”形式,避免出现发现不出来错。...重载类型转化操作符应注意1.必须定义为类成员函数. 2.不能指定返回类型。

70520

C++中链式操作

(2)对赋值操作符进行重载,如果返回是类对象,那么链式赋值操作必须借助于拷贝构造函数才能进行。这样不懂那会有较大运行开销,还要编写正确拷贝构造函数。考察下面的程序。...,一共两次调用拷贝构造函数。...第一次发生在执行c2=c1操作中,函数返回值(临时对象)是由c1构造,这时发生了一次拷贝构造函数调用;第二次发生在为c3赋值时候,赋值运算返回值仍然是一个Complex类对象,这时又发生了一次拷贝构造函数调用...一般来说,实现输入操作符重载,一律采用如下函数原型: istream& operator>>(istream&, className&); 而实现输出操作符重载,一律采用如下函数原型: ostream&...operator<<(ostream&, className&); 如果操作符函数返回是istream或ostream对象,而不是引用,会出现编译错误

1.2K10

自实现 MyString 类

自实现 myString 类主要目的是剖析系统内部 string 类一些实现方法以及加强对类封装、运算符重载等特性掌握。其中包含了几项非常重要功能实现。 使用构造器创建对象。...拷贝构造器创建对象。 赋值运算符重载构造对象。 []运算符重载构造对象数组。 ==运算符重载判断对象是否相等。 +运算符重载实现对象相加。 >> << 流输入输出运算符实现打印和输入。...operator+(const CMyString& another); // 流输入输出 friend std::ostream& operator<<(std::ostream&..., len + 1, another.m_str); return tmp; } std::ostream& operator<<(std::ostream& os, CMyString&...cout << s2.c_str() << endl; /* 以上均是调用构造器来创建 */ // 拷贝构造器 CMyString s3(s2);

16020
领券