贡献者: addis
namespace
函数的一个重要例外就是,如果调用函数的参数有 namespace
,函数前面就不必要声明 namespace。这样不同 namespace 中的同名函数就有可能冲突。解决的办法就是还是在函数前声明 namespace(麻烦),或者直接更改函数名。例子:
#include <iostream>
#include <cmath>
#include <complex>
namespace my {
template< class T >
std::complex<T> sin(const std::complex<T>& z)
{ return z; }
}
int main()
{
using namespace my;
std::complex<double> x(1,2);
std::cout << sin(x) << std::endl; // 编译不通过, ambiguous sin
}
#include <iostream>
以后,getchar()
没有 namespace。这是历史遗留问题。一些数学函数也没有。
using fs = std::filesystem
::
来解决。
using std::name;
)不会发生冲突(没有 namespace 的函数被隐藏),但 using directive(using namespace std;
)就会冲突!
namespace A {}
内部使用 using namespace B;
在 namespace A {}
外部使用 using A::xx;
是安全的,即不会引入 using namespace B
。但如果使用 using namespace A
,则会引入 using namespace B
。
namespace A {}
内部使用 using namespace B;
新定义的函数也不会与 B 中的同名函数 overload,而是会直接覆盖 B 中的函数。
namespace 新名字 { using namespace 老名字; }
。