[英]Scope resolution operator for isalnum
我正在问这个问题,作为对此问题的后续行动。 上一个问题是在大约三年前提出的,所以我问一个新的问题会更好。
我链接到的问题的症结在于,OP试图运行以下代码行:
find_if(s.begin(), s.end(), isalnum);
一些容器s
。 该行代码无法编译,OP应该执行此操作
find_if(s.begin(), s.end(), ::isalnum);
可接受的答案表明,在locale
和cctype
库中存在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.