为什么不能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<<的包含)即可实现coutstd::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>文件的包含,我们即可使用stringostringstream等类,然而当我们想使用其成员函数时,需要包含其最终的实现版。

#include <sstream>

C++基础::为什么不能cout一个string?相关推荐

  1. 习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据。

    习题 7.4 在上题的基础上,编写一个函数input,用来输入5个学生的数据. 代码: #include <iostream> #include <iomanip> using ...

  2. 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被

    2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...

  3. 作业1 OO基础1-3、 设计一个教师类Teacher(属于cn.net.sdkd包)

    作业1 OO基础1-3. 设计一个教师类Teacher(属于cn.net.sdkd包) 要求: 1)属性有编号(int no).姓名(String name).年龄(int age).所属学院(Str ...

  4. Java基础语法(九)——String类

    文章目录 Java基础语法(九)--String类 一.定义方式 二.内存 三.字符串比较相等 四.字符串常量池 (1) 直接赋值 (2)采用构造方法 (3)intern 的使用 五.理解字符串不可变 ...

  5. 一、SpringMVC基础入门,创建一个HelloWorld程序

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  6. 手工建库】(二)在原有数据库的基础上再建立一个数据库

    数据库 congjiu2607 2016-10-23 10:33:38 32 收藏 在原有数据库的基础上再建立一个数据库 (先决条件:当当前虚拟内存不够用时,将现有数据库关闭:如果不关库,则需要增加虚 ...

  7. 学完javaee基础,编的一个小游戏—太阳系的八大行星

    项目完整代码已放到码云上 自行下载: https://gitee.com/tutu_57893_7590/planets 学完javaee基础,编的一个小游戏-太阳系的八大行星 要使太阳系的八大行星, ...

  8. Java基础篇——字符串处理(String,StringBuffer,StringBuild)

    提前说明本次的文章很长但是很有用,有耐心看完的必定不是凡人,必定会有很大的收获.本人在总结的过程中也收获了很多的知识,希望我们可以一起学习.写下这篇文章完全是抱着可以帮助到他人的态度. 虽然要写出很高 ...

  9. 0基础用android做一个excel表查询器(2):编写程序

    0基础用android做一个Excel表查询器(2):编写程序 编完页面下面就该开始写程序了,首先确定一下思路,很简单,将Excel表写入一个List(或数组)里,然后获取Plain Text中写入的 ...

最新文章

  1. yield学习续:yield return迭代块在Unity3D中的应用——协程
  2. 使用OpenCV进行对象检测
  3. u盘扩容软件_扩容盘的认识与检测和量产还原
  4. CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析
  5. POSIX线程的同步
  6. 常用JavaScript的高级技巧
  7. IAR切BANK--命令连接器文件xcl格式说明
  8. SpringBoot和Mybatis的整合
  9. jsp代码没有错,但是总是有红叉(一招解决)
  10. 逻辑回归算法原理及用于解决多分类问题
  11. Hibernate基础知识整理(三)
  12. 腾讯云技术布道师贺嘉正式受邀出席SDCC 2016微信开发专题,分享腾讯云的小程序解决方案...
  13. BD-rate计算原理
  14. 大方无隅,大器晚成,大音希声,大象无形
  15. 人工智能/数据科学比赛汇总 2019.8
  16. SpringBoot(三)配置文件
  17. 爬虫ip代理对高匿代理ip的重要性
  18. getTextSize()和putText()
  19. 引用程序集没有强名称的解决办法
  20. 高红梅:第四章 第三节 现代工业文明的反思与高贵野蛮人的身份认同

热门文章

  1. js中子父级页面相互调用
  2. mysql巡检常用命令_总结Linux下系统巡检常用命令
  3. axure操作回复_Axure8.0基础教程(31-40)新手必须掌握的基础操作
  4. LeetCode 72.编辑距离(动态规划)
  5. DeepStream框架整理
  6. Linux下 C++遍历目录文件
  7. open cv+C++错误及经验总结(十三)
  8. tensorflow中如何进行可视化和减轻过拟合(转)
  9. 动态添加和删除 ListView 项
  10. Cisco AP-Sniffer模式空口抓包