В кругах разработчиков 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();
}
#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.
Ага, и вообще нельзя делать using namespace, потому как может быть это с любым пространством имен.
Крайность до безумия.
В теории, такое может быть с любым пространством имен. На практике, такое, обычно, происходит с пространством имен std. Если уж очень хочется сделать using, то следующий вариант предпочтительнее всего:
С std происходит потому что оно всегда ест.
А вот когда еще имеется десяток других, то делать using NameSpace::Class просто задолбаться можно.