代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

在C++中使用嵌套运算符重载时编译器错误

  •  2
  • Jamison Dance  · 技术社区  · 15 年前

    我有一个url类,它重载==、<、>、和!=用于简单比较的运算符。URL类有一个字符串数据成员和一些函数来处理该字符串。当使用URL类进行测试时,运算符工作正常。

    我还有一个页面类,它有一个URL数据成员。我正试图在page类中重载相同的运算符。页面类中的相等性是基于它们各自的URL的相等性,因此在比较页面时使用URL类布尔运算符。这会产生一些我无法理解的编译器错误。URL运算符的代码:

    bool URL::operator ==(URL & u) const {
        //url is the string instance variable
        return url == u.GetURL();
    }
    

    页面操作员代码:

    bool Page::operator ==(Page & p) const {
        //url is the URL instance variable of the Page class
        return url == p.GetURL();
    }
    

    这会产生如下错误:

    src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’:
    src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’
    inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const
    

    我预测我会忘记一些愚蠢的事情。你能证明我是对的吗?

    编辑: 正确的警察把我咬成了废物。谢谢你的帮助。

    2 回复  |  直到 15 年前
        1
  •  6
  •   isekaijin    15 年前

    应该是:

    bool URL::operator ==(const URL & u) const {
        //url is the string instance variable
        return url == u.GetURL();
    }
    

    与其他操作员类似。

    如果仍然有编译器错误,可能还没有 GetURL() 康斯特:

    std:string URL::GetURL() const {
        // whatever...
    }
    
        2
  •  1
  •   Loki Astari    15 年前

    我还想指出,存在方法(即公共接口)来保护外部实体不受实现细节更改的影响。另外,类自动成为自己的朋友(出于同样的原因),因此只访问其他对象的成员是可以的。

    bool URL::operator ==(URL & u) const {
        //url is the string instance variable
        return url == u.GetURL();
    }
    

    可以这样写:

    bool URL::operator ==(URL & rhs) const
    {
        return url == rhs.url;  // No need to use GetURL()
    }
    

    在我看来,这使代码更清晰(但这也是一种观点,你的口味可能会有所不同)