2011-07-25 12 views
3

"string"ヘッダーを含めずに以下のコードで文字列変数を宣言できます。 しかし、私は文字列を印刷しようとすると、コンパイラはcoutに対してのみ文句を言います。なぜcoutにヘッダ文字列が必要ですか?

「string」ヘッダーはどのような情報で構成されていますか?これは、std::coutのために必須ではありません

#include <iostream> 
//#include "string" 

int main() 
{ 
    std::string str="SomeWorld"; 

    std::cout<<str<<std::endl; 

    return 0; 
} 

答えて

12

std::basic_stringを定義ヘッダは(std::stringstd::basic_string<char>に基づくtypedefである)<iostream>によって含まれる(間接的に)可能性が最も高いからです。しかし、std::coutoperator<<の過負荷は<string>でのみ定義されます。

+0

Visual C++の場合、 ''には実装定義の ''ヘッダが含まれています。これは 'basic_string'自体を定義していますが、あなたの言うように、' operator << 'は定義しません。 – Sven

2

、それがstd::stringのために必須です。

+0

++。 "string"ヘッダを含めずに、std :: string変数を宣言できます。コンパイラはそれを可能にしています。 – vrbilgi

+0

@user - 1つのC++ヘッダに他のヘッダを含めることは許されています。コンパイラごとに異なるので、これに依存することはできません。必要なヘッダーは常に含める必要があります。 –

+0

@ user430294:型を格納するために文書化されたヘッダーが常に必要です。他のすべては実装のものであり、あなたが信頼できるものではありません。 –

0

<string>ヘッダはstringクラスの定義が含ま(注:#include "string"は現在のディレクトリにstringファイルを含めることを意味し、そのシステムは、のためにあなたは、角括弧の代わり"を使用する必要があります。)

しかし、iostreamstringが既に含まれています(たとえば、std::stringで動作するoperator<<を宣言する場合)。そのため、この場合に含める必要はありません。

いずれにしても、必要なヘッダーを含めることをお勧めします。これにより、コードをより移植性の高いものにすることができます。たとえば、そのコードを別のコンテキストにコピーする場合は、より具体的に言えば、これは前のインクルードとしてiostreamを含まないものです。また、たとえばiostreamを含むとstd::stringが利用できるように指定されることはありませんので、厳密に言えば、std::stringを使用するにはstringを含める必要があります。

-2

<string><iostream>に含まれているためです。コンパイラが複雑でない理由です。

+0

質問者は、コンパイラが*していると報告します。 –

+0

一度投票すれば十分だと思います。 – sap

2

正確に言えば、すべてに正しいヘッダーを含めない限り、何かが起こる可能性があります。 1つの標準ヘッダを他のヘッダに強制的に含めることは必須ではありません。だから、ポータブルかつ正確であることを、あなたはこれを言っている:

#include <string> // for `std::string` 
#include <ostream> // for `std::ostream &` in `operator<<` 
#include <iostream> // for std::cout 

int main() { 
    std::string str = "hello world"; 
    std::cout << str << std::endl; 
} 

あなたはほとんど常にヘッダーの一部を(例えばostreamはおそらくiostreamに含まれていたであろう)を省略して逃げることができます任意の実際の実装ではなく、上記は標準に準拠した方法です。

関連する問題