不同使用范围运算符

时间:2015-09-03 23:39:51

标签: c++ scope

要转换字符串并将其设为小写,我们可能会执行以下操作:

#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
using namespace std;

int main()
{
    string str("Sample STRING");

    cout << str << endl;

    std::transform(str.begin(), str.end(), str.begin(), ::tolower);

    cout << str << endl;

    return 0;
}

我知道std::transform的全部内容;但是范围运算符::在函数tolower前做了什么?

如果删除范围运算符,则编译器会抱怨函数不匹配。如果我在std运算符前面添加::,那么编译器也会抱怨函数不匹配。范围运算符在tolower前面的用途是什么?我不知道它叫什么,我到处寻找解释,但无济于事。

2 个答案:

答案 0 :(得分:6)

  1. 您应#include <algorithm>使用std::transform
  2. 您需要的tolower功能在ctype.hcctype中定义。您应该包含其中一个标题。前者在全局命名空间中声明tolower;后者在std命名空间中声明它。
  3. 如果没有::,您可能会选择std::tolower标头中声明的功能模板<locale>。当然,这只会因为你有using namespace std;而发生。这是using namespace std;如何危险的一个特例。
  4. 左边没有任何内容的::意味着右边的名字将是&#34;在全球范围内查找&#34;并且会找到全局tolower而不是std::tolower。 (因此,您应#include <ctype.h>确保获得全局声明。)

答案 1 :(得分:5)

::没有左侧绕过查看所有可访问的子范围并强制使用根(或全局)范围。