在做項目的時候,遇到了一個這樣的問題,下邊舉了一個小例子來模擬一下:
可能讀沒有遇到過類似的問題,如果你知道,你就不需要往下看了。如果你還不清楚上邊代碼有什麼問題,那麼請繼續;
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;
可以根據需要隨時修改名字空間的內容。這樣就避免了每次都要導出需要的名稱的問題。
那麼文章開始的程序的正確代碼如下: