Это не столько ответ, сколько контрапункт к нескольким другим ответам, которые всегда явно отстаивали включение пространства имен как части имени.Иногда это плохая идея.В некоторых случаях вы хотите использовать имя, которое было специализировано для данного типа , если оно существует , но в противном случае используйте стандартную альтернативу.
В качестве типичного примера давайте рассмотримфункция сортировки.Если вы сортируете некоторые объекты типа T, вы в конечном итоге поменяете их местами.Вы хотите использовать специальный swap(T &, T&)
, если он существует, но template <class T> std::swap
в противном случае.
Если вы попытаетесь указать полное имя свопа, который вы собираетесь использовать явно, вы должны указать один илидругой - либо вы указываете специализированную версию, и создание экземпляра вашей сортировки по типу, который не определяет собственный своп, завершится неудачей, либо вы укажете std::swap
и проигнорируете любой своп, предоставленный специально для типа, который вы 'Пересортировка.
using
предоставляет выход из этой дилеммы, хотя:
using namespace std;
template <class T>
mysort(/* ... */ ) {
// ...
if (less(x[a], x[b])
swap(x[a], x[b]);
// ...
}
Теперь, если пространство имен, в котором найден T, содержит swap(T &, T&)
, оно будетнайдено с помощью зависимого от аргумента поиска и использовано выше.Если он не существует, то std::swap
будет найден (и использован), потому что using namespace std;
также сделал его видимым.
В целом, я думаю, что с одной незначительной модификацией, using namespace x;
можетбыть почти полностью безвредным.В нынешнем виде он вводит имена из этого пространства имен в текущую область.Если одно из них совпадает с именем, существующим в текущей области, мы получаем конфликт.Проблема, конечно, заключается в том, что мы можем не знать всего, что содержит пространство имен, поэтому почти всегда есть хотя бы некоторый потенциал для конфликта.
Модификация будет заключаться в том, чтобы обрабатывать using namespace x;
так, как если бы он создавал область видимости.окружая текущую область, и ввел имена из этого пространства имен в эту окружающую область.Если бы одно из них оказалось таким же, как имя, введенное в текущей области, то никакого конфликта не было бы, хотя - как и любая другая область видимости блока, имя в текущей области скрыло бы то же имя из окружающей области.
Я не продумал это до мельчайших подробностей, поэтому, несомненно, были бы некоторые угловые случаи, которые потребовали бы большего внимания, чтобы решить, но я думаю, что общая идея, вероятно, могла бы многое сделать совсем немноговсе равно проще.