2013-02-22 67 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