【问题标题】:Scope resolution operator for isalnumisalnum 的范围解析运算符
【发布时间】:2015-12-18 05:37:02
【问题描述】:

我提出这个问题是对this 问题的跟进。上一个问题是大约三年前提出的,所以我认为问一个新问题会更好。

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

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

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

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

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

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

谢谢

编辑

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

【问题讨论】:

    标签: c++ scope scope-resolution


    【解决方案1】:

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

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

    【讨论】:

    • 默认情况下这些符号不可用,但是实现可以包含来自其他标准头文件的标准头文件。
    • @Andrew,“因为 C 库中的符号在全局范围内可用。” 不一定。它们可能在全球范围内,但可能不在。只有包含 <ctype.h> 才能保证。
    • @Andrew 好的,谢谢。最后一个问题:要访问locale 中的函数,而不是cctype,我需要写什么?我做了一些阅读,有些人建议将参数转换为与所需函数匹配的特定函数指针。这是唯一的方法吗?
    • 不,您也可以使用 lambda 函数,以便对 alnum 的调用完成重载解析:find_if(s.begin(), s.end(), [](unsigned char c){ return std::isalnum(c); });
    • @KonradKapp,是的。显然,如果你想在 <locale> 中调用两个参数版本,那么你会用两个参数来调用它,而不是一个。
    【解决方案2】:

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

    如果你有:

    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”函数,他需要专门引用全局函数而不是类函数。

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

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 2010-09-09
      • 2014-10-05
      • 2018-04-24
      • 1970-01-01
      • 2017-04-07
      • 2013-06-13
      • 2011-05-09
      • 2011-07-28
      相关资源
      最近更新 更多