Code Fix

初級

'cout' was not declared エラー(std::忘れ)の原因

#include <iostream> はしているのに、std::を付けずにcoutやendlをそのまま使ったときに出るエラーです。C++では標準ライブラリの名前はstd名前空間の中にあり、省略するにはusing宣言が必要です。

エラーメッセージの読み方

main.cpp:3:5: error: 'cout' was not declared in this scope; did you mean 'std::cout'?
main.cpp
ファイル名
3
行番号
5
列番号 — この位置でg++が構文解析に失敗しました
'cout' was not declared in this scope; did you mean 'std::cout'?
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  #include <iostream>
 2  int main() {
 3      cout      << "hello" << std::endl;
            ^
 4      return 0;
 5  }
main.cpp:3:5: error: 'cout' was not declared in this scope; did you mean 'std::cout'?

iostreamはインクルードしていますが、coutはstd名前空間の中にあるため、std::を省略すると見つかりません。

直し方: cout を std::cout にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  #include <iostream>
 2  int main() {
 3      int x = 5;
 4      cout      << x << std::endl;
            ^
 5      return 0;
 6  }
main.cpp:4:5: error: 'cout' was not declared in this scope; did you mean 'std::cout'?

g++は「did you mean 'std::cout'?」と修正候補まで示してくれますが、修正するのは自分自身です。

直し方: cout を std::cout にします。

この問題を解いてみる →

パターン3

 1  #include <iostream>
 2  int main() {
 3      std::cout << "score: " << 90 << endl     ;
                                           ^
 4      return 0;
 5  }
main.cpp:3:37: error: 'endl' was not declared in this scope; did you mean 'std::endl'?

coutにはstd::を付けていても、endlの方に付け忘れると同じ種類のエラーが個別に発生します。

直し方: << endl を << std::endl にします。

この問題を解いてみる →

パターン4

 1  #include <iostream>
 2  int main() {
 3      cout      << "done" << std::endl;
            ^
 4      return 0;
 5  }
main.cpp:3:5: error: 'cout' was not declared in this scope; did you mean 'std::cout'?

iostreamはインクルードしていても、coutはstd名前空間の中にあるためstd::を省略すると見つかりません。

直し方: cout を std::cout にします。

この問題を解いてみる →

パターン5

 1  #include <iostream>
 2  int main() {
 3      int n = 42;
 4      std::cout << n << endl     ;
                             ^
 5      return 0;
 6  }
main.cpp:4:23: error: 'endl' was not declared in this scope; did you mean 'std::endl'?

coutにstd::を付けていても、endlの方に付け忘れると同じ種類のエラーが個別に起こります。

直し方: << endl を << std::endl にします。

この問題を解いてみる →

よくある誤解

「includeさえすれば関数名だけで使える」と思われがちですが、includeは宣言を読み込むだけで、名前空間の省略を許可するわけではありません。省略したいなら明示的にusing namespace std;かusing std::cout;が必要です。

実務での勘所

using namespace std;は入門書ではよく使われますが、実務の大規模なコードでは避けるべきとされています。標準ライブラリと自作のコード、あるいは複数のライブラリを組み合わせたときに、同じ名前の関数や型がstd名前空間と衝突する可能性が生まれるためです。ヘッダファイルの中でこれを書くと、そのヘッダをインクルードした全てのファイルに影響が及ぶため、特に危険とされています。代わりにusing std::cout;のように必要な名前だけを個別に取り込むか、毎回std::を明示するほうが安全です。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)