为什么会这样?
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 :(得分:16)
using namespace std;
指示编译器在::
中搜索未修饰的名称(即没有std
s的名称)以及根名称空间。现在,您正在查看的tolower
是C库的一部分,因此位于根命名空间中,它始终位于搜索路径上,但也可以使用::tolower
显式引用。
但是还有一个std::tolower
,它有两个参数。当你有using namespace std;
并尝试使用tolower
时,编译器不知道你的意思,所以它会变成错误。
因此,您需要使用::tolower
指定您希望根域名空间中的那个。
顺便提一下,这是using namespace std;
可能是个坏主意的一个例子。 std
中有足够的随机内容(并且C ++ 0x增加了更多!),很可能发生名称冲突。我建议您不要使用using namespace std;
,而应明确使用,例如using std::transform;
具体而言。