2011-07-12 58 views
5

這是爲什麼?C++名稱空間混亂 - std :: vs :: vs呼叫tolower時沒有前綴?

transform(theWord.begin(), theWord.end(), theWord.begin(), std::tolower); - 不工作 transform(theWord.begin(), theWord.end(), theWord.begin(), tolower); - 不工作

transform(theWord.begin(), theWord.end(), theWord.begin(), ::tolower); - 確實工作

theWord是一個字符串。我是using namespace std;

它爲什麼與前綴::一起使用,而不是與std::或不帶?

感謝您的幫助。

+0

你包含哪些頭文件? –

+0

'#包括 的#include 的#include 的#include 的#include 的#include 的#include ' – user839913

回答

16

using namespace std;指示編譯器搜索std以及根名稱空間中的未修飾名稱(即沒有0​​)。現在,您正在查看的tolower是C庫的一部分,因此位於根名稱空間中,該名稱空間始終位於搜索路徑中,但也可以用::tolower明確引用。

但是,也有一個std::tolower,它需要兩個參數。當你有using namespace std;並且試圖使用tolower時,編譯器不知道你是哪一個人,所以它變成了一個錯誤。

因此,您需要使用::tolower來指定您想要的根名稱空間中的一個。

順便說一句,這就是爲什麼using namespace std;可能是個壞主意的例子。 std中有足夠的隨機內容(並且C++ 0x增加了更多!),這很可能會發生名稱衝突。我建議你不要使用using namespace std;,而是明確地使用,例如,特別是using std::transform;

+0

所以:: tolower的講述了根名字空間的編譯器的外觀,和std :: tolower的告訴編譯器查看標準名稱空間。那是對的嗎?在這種情況下,我想從根名稱空間中獲取tolower而不是標準名稱空間。 – user839913

+0

對。或者你可以停止使用'using namespace std'並且tolower可以正常工作:) – bdonlan

+3

從技術上講,OP的:: tolower()只是由於實現細節而存在。爲了保證C庫的'tolower'在全局命名空間中,必須包含''而不是''(參見'D.5 [depr.c.headers]/2') – Cubbi