using namespace std

В кругах разработчиков C++ периодически возникает спор на тему “почему нельзя/нужно использовать using namespace std“. Наткнулся на довольно показательный пример того, почему этого делать ни в коем случае нельзя.
Товарищ пытается написать удаление пробелов из строки:

#include <iostream>

#include <string>

using namespace std;

int main(int argc, char* argv[]) {
    string str = "";
    cin >> str;
    remove(str.begin(), str.end(), ' ');
    cout << str;
    cin.ignore();
}

и получет довольно неожиданную ошибку компиляции.

'remove': function does not take 3 arguments (C2660)

А все почему? Да потому-что никогда, ни при каких условиях, не надо давать символам из пространства std глобальную видимость! Ведь в данном случае, можно было получить куда более понятное “error: ‘remove’ was not declared in this scope” просто убрав using namespace std.

3 Comments using namespace std

  1. NN

    Ага, и вообще нельзя делать using namespace, потому как может быть это с любым пространством имен.
    Крайность до безумия.

    Reply
    1. Alexander Stavonin

      В теории, такое может быть с любым пространством имен. На практике, такое, обычно, происходит с пространством имен std. Если уж очень хочется сделать using, то следующий вариант предпочтительнее всего:

      using std::remove;
      Reply
      1. NN

        С std происходит потому что оно всегда ест.
        А вот когда еще имеется десяток других, то делать using NameSpace::Class просто задолбаться можно.

        Reply

Leave a Reply