2

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

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

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

在某个容器上s。该行代码编译失败,OP应该这样做

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

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

我的问题的第二部分是,::操作员如何告诉我们isalnum我们想要哪个功能?

谢谢

编辑

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

4

2 回答 2

3

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

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

于 2015-09-21T13:36:36.240 回答
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().

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

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

于 2015-09-21T13:42:45.220 回答