Глиф Учебники

Ошибка was not declared in this scope

Справочник · C++ · 1 минута чтения

Компилятор встретил имя, которого не знает в этом месте программы. В Visual Studio та же ошибка называется C2065: undeclared identifier (для функций — C3861: identifier not found).

Как исправить

Посмотрите, какое имя указано в кавычках: из стандартной библиотеки (cout, vector, sort…), ваша переменная или ваша функция.

Имя из стандартной библиотекиcout, vector, sort…

Не подключён заголовок

Имя в ошибкеНужен #include
cout, cin, endl<iostream>
string, getline, stoi, to_string<string>
vector<vector>
sort, reverse, max_element, min_element<algorithm>
sqrt, pow, fabs<cmath>
setprecision, fixed<iomanip>
map, set<map>, <set>

Свежие версии g++ для многих имён подсказывают сами: note: 'std::cout' is defined in header '<iostream>'; did you forget to '#include <iostream>'?.

Нет std:: и нет using namespace std

cout без std:: и без строки using namespace std; компилятор не найдёт. g++ подскажет: did you mean 'std::cout'?. Добавьте std:: или строку using namespace std; после #include (что она значит — в справке using namespace std — что это).

Опечатка

C++ различает большие и маленькие буквы: Cout, Vector, String, Main — это другие имена.

Дальше: «Совет»

Своя переменнаяопечатка или вне блока

Опечатка в имени

Проверьте само имя переменной: объявлена count, а используется cout или cnt. Большие и маленькие буквы различаются: Sum и sum — разные имена.

Переменная за пределами своего блока

Переменная живёт только внутри фигурных скобок { }, где её объявили, а счётчик цикла — только внутри цикла:

C++
for (int i = 0; i < n; i++) {
    int square = i * i;
}
cout << i << square;   // ошибка: ни i, ни square здесь уже нет

Если значение нужно после блока, объявите переменную до него:

C++
#include <iostream>
using namespace std;

int main() {
    int n = 5;
    int last = 0;
    for (int i = 0; i < n; i++) {
        last = i * i;
    }
    cout << last << "\n";
    return 0;
}
Вывод
16

То же с if: переменная, объявленная внутри if { ... }, после закрывающей скобки недоступна.

Дальше: «Совет»

Своя функциянаписана ниже места вызова

Компилятор читает файл сверху вниз. Если main вызывает solve(), а solve написана ниже main, в момент вызова она ещё неизвестна. Перенесите функцию выше main или поставьте выше её объявление:

C++
#include <iostream>
using namespace std;

int solve(int x);       // объявление: функция будет ниже

int main() {
    cout << solve(4) << "\n";
    return 0;
}

int solve(int x) {
    return x * 10;
}
Вывод
40

Если функция уже стоит выше, сверьте имя в вызове и в объявлении: Solve и solve — разные имена.

Совет

Исправляйте ошибки сверху вниз по одной и собирайте заново. Одна пропущенная скобка или #include может породить десятки сообщений ниже, и они исчезнут вместе с первой ошибкой.