在做项目的时候,遇到了一个这样的问题,下边举了一个小例子来模拟一下:
可能读没有遇到过类似的问题,如果你知道,你就不需要往下看了。如果你还不清楚上边代码有什么问题,那么请继续;
C++鼓励我们使用名字空间,名字空间有助于组织程序中使用的标示符,避免名字冲突。但是对于名字空间的使用,C++新手还是有使用不当的时候。
可能你会反驳,名字空间有什么难的,不就是个namespace {}; 还有个using namespace ..;吗?那么如果你这样理解的话,那么请你找出上边代码的问题。
现在,我来告诉你上边代码的问题所在。在std名字空间中,有一个transform的标示符,而我们的main函数中需要使用的是STL的transform,这两个函数虽然名字相同,但是却是不同的定义。
而我们在test.h中使用了using namespace std; 我们在main.cpp中包含了test.h,相当于我们在main函数中也使用了using namespace std;。而我们使用的transform函数确不属于这个名字空间。也就是说,在main函数中不能直接使用using namespace std;导出std名字空间中的所有名称,这样做不符合名字空间的设计初衷。而在很多C++的教材中,大部分的案例都是采用了using namespace std;.这样给初学者造成了一个感性的错误认识。
那么我们应该怎么做呢?
1.最好不要在头文件中使用using namespace std;
2.在源文件中可以使用,但是不建议导出所有的名称。用那些就导出哪些;
3.可以自己定义一个名字空间,把我们常使用的名称放在里边;
如:
namespace mystd
{
using std::cout;
using std::cin;
using std::string;
using std::stringstream;
using std::fstream;
using std::vector;
...
}
如果调用的时候 ,直接应用using namespacet mystd;
可以根据需要随时修改名字空间的内容。这样就避免了每次都要导出需要的名称的问题。
那么文章开始的程序的正确代码如下: