Рассмотрим этот заголовок библиотеки:
#include<vector>
#include<algorithm>
#include<iostream>
namespace Lib {
namespace detail {
using namespace std;
template<class T>
void sort_impl(istream &in,ostream &out) {
vector<T> v;
{
int n;
in >> n;
v.resize(n);
}
for(auto &i : v) cin >> i;
sort(v.begin(),v.end());
for(auto i : v) out << i << endl;
}
}
inline void sort_std() {
detail::sort_impl<int>(std::cin,std::cout);
}
}
Успешно ли пространство имен detail
изолирует клиентов библиотеки (и остальную часть реализации библиотеки) от using-directive в этом примере? Меня не интересует обсуждение на Почему использование пространства имен std считается плохим практика?, даже если некоторые из аргументов применимы даже к «хорошо сдержанным» директивам использования.
Обратите внимание, что есть два существующих вопроса, касающихся одной и той же ситуации, но с using-декларациями:
- Использование объявлений в частных пространствах имен в файлах заголовков
- Элегантный способ предотвратить отравление пространства имен в C ++ (чей единственный ответ это действительно ответ на вопрос о "плохой практике" выше)
Это можно было бы сочетать с любым из них, но редактирование было бы серьезным.
using namespace std;
вsort_impl
. Тогда все будет в порядке. - person Henri Menke   schedule 12.09.2017sort_impl
, вы должны указатьistream
иostream
в ее подписи. (Это не катастрофа, но предотвращение такого многословия - причина использования директивы using!) Вы также должны иметь по одной для каждой функции. - person Davis Herring   schedule 12.09.2017