2013-02-22 29 views
3

今天我收到了一些發送給我的代碼,它使用std :: string中的std :: transform使它全部爲小寫。寄件人寫在Visual Studio 2010中編譯的代碼:Visual Studio:全局命名空間優先於本地

using namespace std; 
string test = "TEST"; 
transform(test.begin(), test.end(), test.begin(), tolower); 

Wheras我編譯它在OSX與海灣合作委員會和/或鏘,並得到了編譯錯誤,因爲它涉及到命名空間的衝突。

確實有一堆解決全局命名空間與本地(:: tolower vs std :: tolower)的回答問題,但這是關於這段代碼實際上在VS上工作的事實。

問題我想答案:

  1. 爲什麼Visual Studio中編譯這個?
  2. 它如何默認(?)到全局命名空間::何時std ::應該取 優先?

注:進出口使用GCC 4.2和鏘(425.0.24 LLVM 3.2svn)在OSx Mountain Lion上

回答

1

這裏的問題是雙重的。首先,如果你沒有具體的#include <cctype>,你可能會得到一個宏,而不是一個函數(儘管我不知道這是否真的是一個問題,這是否會違反標準。)

二,在C++中tolower被重載。你需要選擇一個特定的超載使用:

transform(test2.begin(), test2.end(), test2.begin(), 
      static_cast<int(*)(int)>(tolower)); 

但我不知道爲什麼std::得到一個重載版本和::沒有的原因。在任何情況下,我建議你從那些C函數望而卻步,轉而使用std::ctype<locale>頭,它提供了一個更好的tolower

http://www.cplusplus.com/reference/locale/ctype

+0

雖然這個答案的部分,它還是有趣理解爲什麼VS需要:: tolower之前(或者我應該說,而不是)std :: tolower。可能會有一些參數查找,[鏈接](http://msdn.microsoft.com/en-us/library/60bx1ys7(v = vs.90).aspx)發生。但我不知道,因爲我沒有安裝VS實例。請注意,GCC也具有依賴於參數的查找,但在這種情況下表現出不同的行爲。 – hugolm84 2013-02-22 13:10:30