我问这是this问题的后续行动。上一个问题是在差不多三年前提出来的,所以我虽然问一个新问题会更好。
我所关联的问题的关键是OP尝试运行以下代码行:
find_if(s.begin(), s.end(), isalnum);
在某个容器s
上。代码行无法编译,OP应该已经完成了这个
find_if(s.begin(), s.end(), ::isalnum);
接受的答案表明locale
和cctype
库中存在isalnum函数,并且编译器在两者之间消除歧义,因此::
范围解析运算符。我通过仅包含其中一个库来测试它,并且编译器仍然存在消除歧义的问题。这是为什么?如果我只包含其中一个库,那么显然编译器不应该“知道”其他库,那么为什么会发生冲突?
我的问题的第二部分是::
运算符如何告诉我们我们想要哪个isalnum
函数?
由于
修改
我知道::
运算符告诉我们我们想要的函数/变量在全局范围内,但仍然没有回答我的第二个问题。
答案 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;函数在他当前的类和全局函数中实现,他需要专门引用全局函数而不是类函数。
编辑:我想我误解了这个问题,安德鲁已经比我更好地回答了问题。