繁体   English   中英

isalnum的范围解析运算符

[英]Scope resolution operator for isalnum

我正在问这个问题,作为对此问题的后续行动。 上一个问题是在大约三年前提出的,所以我问一个新的问题会更好。

我链接到的问题的症结在于,OP试图运行以下代码行:

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

一些容器s 该行代码无法编译,OP应该执行此操作

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

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

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

谢谢

编辑

我知道::操作符告诉我们我们想要的函数/变量在全局范围内,但这仍然无法回答我的第二个问题。

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

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

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

因此,如果您有:

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()

在上述情况下,可能是他在当前类以及全局函数中都实现了“ isalnum”函数,并且他需要专门引用全局函数而不是类函数。

编辑:我想我误解了这个问题,安德鲁比我自己回答得更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM