web-dev-qa-db-ja.com

<iostream>の横に#include <string>を使用する必要がありますか?

私はC++を学び始め、文字列型がコンパイラに直接組み込まれていないため、<string>ヘッダーファイルを使用する必要があると書いている本を読みました。 <iostream>を使用すると、文字列型を使用できます。

<string>ヘッダーを含めた場合、文字列型を使用する場合、<iostream>ヘッダーを含める必要がありますか?どうして?違いはありますか?

21
KOB

はい、使用するものを含める必要があります。標準ヘッダーが相互に含まれていることは必須ではありません(いくつかの例外IIRCを除く)。今は動作するかもしれませんが、別のコンパイラでは失敗する可能性があります。

あなたの場合、明らかに<iostream>には<string>が直接的または間接的に含まれていますが、それに依存しないでください。

24
Luchian Grigore

<string>ヘッダーを含めた場合、文字列型を使用する場合、<iostream>ヘッダーを含める必要がありますか?

はい、あなたはしなければなりません。関連するヘッダー(例:<string>)が他のヘッダー(例:#include)を介して間接的に<iostream>dであることに依存することはできませんが、これは一部の実装に当てはまる場合があります。

そして、これが動作しているように見える場合でも、一部の演算子の関連するオーバーロードのすべてがインポートされていない場合、またはクラスがインポートされている場合は、問題が発生する可能性がありますヘッダーで#includeを転送宣言しますが、他のクラスから派生したそのクラスに関する情報は、#includedを取得しないヘッダーにのみ含まれます。

このような状況の例については、たとえば StackOverflowに関するこのQ&A を参照してください。

8
Andy Prowl