C++基础::为什么不能cout一个string?
为什么不能cout一个string
#include<iostream>
int main(int, char**)
{std::string str("hello"); // 正确std::cout << str << std::endl;// 错误,没有与这些操作数(operand,std::string)相匹配的"<<"运算符return 0;
}
cout
竟然不能输出string
类型,这太令人诧异了?究其原因,STL中的许多头文件(这其中就包括,Visual C++环境下)都包含std::basic_string
类的定义式,因为它们都间接地包含了<xstring>
(但不要试图直接包含<xstring
),这就保证了你可以仅include
这些头文件(如本例的#include <iostream>
)就可使用std::string
类,
typedef basic_string<char, char_traits<char>, allocator<char> >string; // string类型其实一个类模板的特化版本的类型重定义
然而,问题在于与之相关的operator<<
却定义在<string>
头文件,你必须手动地将之包含。
所以,我们只需包含<string>
(也即对operator<<
的包含)即可实现cout
对std::string
类型的输出:
#include <iostream>
#include <string>
int main(int, char**)
{std::string str("hello");std::cout << str << std::endl;return 0;
}
以上的设置仅对Visual C++环境有效,也即在大多数的STL的头文件中,都包含了
std::basic_string
的定义式,仅通过对这些头文件的包含即可使用std::string
类,而想使用operator<<
却需手动包含<string>
头文件。在重申一遍,这些包含和依赖关系仅对Visual C++环境有效。
ostringstram 声明与定义
同样的问题出现在将一个string类型的输入到一个输出文件流时:
#include <iostream>
#include <string>
int main(int, char**)
{std::string str("hello world");std::ostringstream oss; // ERROR: 不允许使用不完整的类型oss << str; // std::cout << oss.str() << endl;return 0;
}
查看源码可知:
// iosfwd -> 被间接地包含在<iostream>中
typedef basic_ostringstream<char, char_traits<char>,allocator<char> > ostringstream;// xstring -> 被间接地包含在<iostream>中
typedef basic_string<char, char_traits<char>, allocator<char> >string;
仅通过对<iostream>文件的包含,我们即可使用string
和ostringstream
等类,然而当我们想使用其成员函数时,需要包含其最终的实现版。
#include <sstream>
C++基础::为什么不能cout一个string?相关推荐
- 习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据。
习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据. 代码: #include <iostream> #include <iomanip> using ...
- 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被
2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...
- 作业1 OO基础1-3、 设计一个教师类Teacher(属于cn.net.sdkd包)
作业1 OO基础1-3. 设计一个教师类Teacher(属于cn.net.sdkd包) 要求: 1)属性有编号(int no).姓名(String name).年龄(int age).所属学院(Str ...
- Java基础语法(九)——String类
文章目录 Java基础语法(九)--String类 一.定义方式 二.内存 三.字符串比较相等 四.字符串常量池 (1) 直接赋值 (2)采用构造方法 (3)intern 的使用 五.理解字符串不可变 ...
- 一、SpringMVC基础入门,创建一个HelloWorld程序
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...
- 手工建库】(二)在原有数据库的基础上再建立一个数据库
数据库 congjiu2607 2016-10-23 10:33:38 32 收藏 在原有数据库的基础上再建立一个数据库 (先决条件:当当前虚拟内存不够用时,将现有数据库关闭:如果不关库,则需要增加虚 ...
- 学完javaee基础,编的一个小游戏—太阳系的八大行星
项目完整代码已放到码云上 自行下载: https://gitee.com/tutu_57893_7590/planets 学完javaee基础,编的一个小游戏-太阳系的八大行星 要使太阳系的八大行星, ...
- Java基础篇——字符串处理(String,StringBuffer,StringBuild)
提前说明本次的文章很长但是很有用,有耐心看完的必定不是凡人,必定会有很大的收获.本人在总结的过程中也收获了很多的知识,希望我们可以一起学习.写下这篇文章完全是抱着可以帮助到他人的态度. 虽然要写出很高 ...
- 0基础用android做一个excel表查询器(2):编写程序
0基础用android做一个Excel表查询器(2):编写程序 编完页面下面就该开始写程序了,首先确定一下思路,很简单,将Excel表写入一个List(或数组)里,然后获取Plain Text中写入的 ...
最新文章
- yield学习续:yield return迭代块在Unity3D中的应用——协程
- 使用OpenCV进行对象检测
- u盘扩容软件_扩容盘的认识与检测和量产还原
- CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析
- POSIX线程的同步
- 常用JavaScript的高级技巧
- IAR切BANK--命令连接器文件xcl格式说明
- SpringBoot和Mybatis的整合
- jsp代码没有错,但是总是有红叉(一招解决)
- 逻辑回归算法原理及用于解决多分类问题
- Hibernate基础知识整理(三)
- 腾讯云技术布道师贺嘉正式受邀出席SDCC 2016微信开发专题,分享腾讯云的小程序解决方案...
- BD-rate计算原理
- 大方无隅,大器晚成,大音希声,大象无形
- 人工智能/数据科学比赛汇总 2019.8
- SpringBoot(三)配置文件
- 爬虫ip代理对高匿代理ip的重要性
- getTextSize()和putText()
- 引用程序集没有强名称的解决办法
- 高红梅:第四章 第三节 现代工业文明的反思与高贵野蛮人的身份认同