error: 'cout' is not a member of 'std' の原因と直し方
#include <iostream> を書き忘れたまま std::cout や std::endl を使ったときに出るエラーです。名前空間std自体は存在していても、その中身(cout)を知るにはヘッダのインクルードが必要です。
エラーメッセージの読み方
main.cpp:3:10: error: 'cout' is not a member of 'std'
main.cpp- ファイル名
3- 行番号
10- 列番号 — この位置でg++が構文解析に失敗しました
'cout' is not a member of 'std'- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 ^ 2 int main() { 3 std::cout << "hello" << std::endl; 4 return 0; 5 }
std::coutを使うにはiostreamヘッダのインクロードが必要です。std名前空間自体は存在しても、coutの宣言はiostreamの中にあるため、インクルードを忘れるとコンパイラは見つけられません。
直し方: (空) を #include <iostream> にします。
パターン2
1 ^ 2 int main() { 3 int x = 5; 4 std::cout << x << std::endl; 5 return 0; 6 }
変数を出力する場合でも、iostreamをインクルードしていなければstd::coutは使えません。
直し方: (空) を #include <iostream> にします。
パターン3
1 ^ 2 int main() { 3 std::cout << 42 << std::endl; 4 return 0; 5 }
数値リテラルを出力するだけの単純なコードでも、iostreamのインクルードが無ければ同じエラーになります。
直し方: (空) を #include <iostream> にします。
パターン4
1 ^ 2 int main() { 3 std::cout << "result" << std::endl; 4 return 0; 5 }
std::coutを使うにはiostreamのインクルードが必要です。忘れるとcoutがstdのメンバとして見つかりません。
直し方: (空) を #include <iostream> にします。
パターン5
1 ^ 2 int main() { 3 double x = 3.5; 4 std::cout << x << std::endl; 5 return 0; 6 }
変数を出力する場合でも、iostreamをインクルードしていなければ同じエラーになります。
直し方: (空) を #include <iostream> にします。
よくある誤解
「std::と書けばいつでも使える」というのは誤解です。std名前空間の中身はヘッダファイルごとに分かれて宣言されているため、対応するヘッダをインクルードしていなければコンパイラはcoutの存在を知りません。
実務での勘所
C++がstdの中身をヘッダごとに細かく分けているのは、コンパイル時間を抑えるためです。標準ライブラリ全体の宣言を常にすべて読み込む設計にすると、小さなプログラムをコンパイルするだけでも莫大な量の宣言を毎回処理することになり、大規模なプロジェクトでは致命的にビルドが遅くなります。必要な機能ごとにヘッダを分けて「使う分だけインクルードする」設計は、C++がコンパイル時間を重視する言語であることの表れです。