【发布时间】:2018-02-20 10:22:47
【问题描述】:
考虑这个库头:
#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 隔离开来?我对Why is "using namespace std" considered bad practice? 的讨论不感兴趣,尽管其中一些论点甚至适用于“包含良好的”using-directives。
请注意,存在两个关于相同情况但使用 using-declarations 的问题:
- Using declarations in private namespaces in header files
- Elegant way to prevent namespace poisoning in C++(其一个答案确实是对上述“不良做法”问题的回答)
这可以与其中任何一个结合,但编辑会很严重。
【问题讨论】:
-
您应该将
using namespace std;移动到sort_impl。那你就没事了。 -
如果 using 指令在
sort_impl中,您必须在其签名中限定istream和ostream。 (不是灾难,但避免这种冗长是使用指令的原因!)您还必须为每个函数都有一个。
标签: c++ namespaces using-directives