isalnum的范围解析运算符

时间:2015-09-21 13:31:54

标签: c++ scope scope-resolution

我问这是this问题的后续行动。上一个问题是在差不多三年前提出来的,所以我虽然问一个新问题会更好。

我所关联的问题的关键是OP尝试运行以下代码行:

find_if(s.begin(), s.end(), isalnum);

在某个容器s上。代码行无法编译,OP应该已经完成​​了这个

find_if(s.begin(), s.end(), ::isalnum);

接受的答案表明localecctype库中存在isalnum函数,并且编译器在两者之​​间消除歧义,因此::范围解析运算符。我通过仅包含其中一个库来测试它,并且编译器仍然存在消除歧义的问题。这是为什么?如果我只包含其中一个库,那么显然编译器不应该“知道”其他库,那么为什么会发生冲突?

我的问题的第二部分是::运算符如何告诉我们我们想要哪个isalnum函数?

由于

修改

我知道::运算符告诉我们我们想要的函数/变量在全局范围内,但仍然没有回答我的第二个问题。

2 个答案:

答案 0 :(得分:3)

isalnum中的<locale>在名称空间std中定义。来自isalnum的{​​{1}}在名称空间<cctype> 中全局定义,因为来自C库的符号(可能[1])在全局范围内可用。使用std从全局范围请求::isalnum的版本,而不是isalnum

[1]。该标准保证如果您包含namespace std,则符号将位于全局范围内。对于C库头文件,<ctype.h>版本几乎总是如此,尽管严格来说它是实现定义的。

答案 1 :(得分:0)

根据我的理解,使用范围解析运算符(::)有助于识别程序的范围。

所以如果你有:

Add();     //This is in Global Scope

class Test{
    void Add();       //This is in scope of the "Test" class
    int useAdd(); { ::Add();}
}

因此,在这种情况下,useAdd()函数引用全局范围中的add函数,而不是测试类中的add函数。如果您想使用范围解析运算符引用测试类中的那个,则可以放置Test::Add()而不是::Add()

在上述情况下,可能是他有#34; isalnum&#34;函数在他当前的类和全局函数中实现,他需要专门引用全局函数而不是类函数。

编辑:我想我误解了这个问题,安德鲁已经比我更好地回答了问题。