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>
相關文章
- [Java基礎]String 為什麼是不可變的?Java
- C++基礎::stringC++
- C++ 的 cin/cout 為什麼比 C 語言的 scanf/printf 慢C++
- [C++] cin, cout, clog, cerr中的c是什麼意思C++
- C++基礎:什麼是名稱空間C++
- 為什麼 JavaScript 是 TypeScript 的基礎JavaScriptTypeScript
- C++是什麼意思,為什麼叫C++?C++
- 為什麼不能每週釋出一次?
- C++中string字串的基礎操作,學習C++字串
- C/C++—— C++中一個空物件為什麼還要佔用一個位元組空間C++物件
- 為什麼零基礎也可以學
- 程式語言十萬個為什麼之java web的基礎概念JavaWeb
- c++ cout 格式輸出C++
- C++基礎(十二)一個巨集使用的坑C++
- Vue(ES6)中的data屬性為什麼不能是一個物件?Vue物件
- 為什麼軟體測試不能幹一輩子?
- java基礎:String — 原始碼分析(一)Java原始碼
- C++(std::cout 處理 char*)C++
- 為什麼Java String雜湊乘數為31?Java
- 為什麼都推薦零基礎學Java?Java
- 為什麼說.gitignore不能忽視Git
- 伺服器為什麼不能放在公司伺服器
- 為什麼pycharm下不能使用importPyCharmImport
- Java介面為什麼不能例項化Java
- 為什麼Facebook不能停止使用PHP?PHP
- 為什麼起床後不能收郵件?
- 為什麼不能當職業翻譯
- XDoclet為什麼不能生成介面檔案?
- c#基礎-基礎-16.stringC#
- 為什麼為什麼為什麼為什麼為什麼你要做一名程式設計師?程式設計師
- C++初始化,之不明白篇 cout<<x<<endl 與 cout<<"x = "<<cout<<x<<endl的輸出的值會不一樣C++
- 為什麼說ad hoc的模型缺乏理論基礎模型
- String,StringBuffer, StringBuilder 的區別是什麼?String為什麼是不可變的?UI
- C++ string的內部究竟是什麼樣的?C++
- 為什麼C++編譯器不能支援對模板的分離式編譯 (轉)C++編譯
- jboss為什麼只能部署war包之類的呢?為什麼不能像tomcat那樣釋出一個資料夾,不用打包Tomcat
- 常用基礎知識面試(C++為主)面試C++
- 為什麼不能和程式媛談戀愛?