为什么operator ==不能自动合成C ++中的嵌套类

时间:2012-01-20 15:39:45

标签: c++ nested-class

如果我尝试编译:

class Outer 
{
    class Inner 
    {
        int t;
    };
public:
    Inner inner_;
    bool operator ==(Outer rightSide);
};

bool Outer::operator ==(Outer rightSide)
{
    if (inner_ == rightSide.inner_)
        return true;
    return false;
}

我收到错误:

/home/martin/Projects/Experimentation/Various-build-desktop/../Various/main.cpp:18: 
error: no match for ‘operator==’ in ‘((Outer*)this)->Outer::inner_ == 
rightSide.Outer::inner_’

请问,这只是我做错了什么或者这是C ++的属性

编辑:

哦,我从来没有意识到操作符==从未合成,我确信它是合成的,我没有费心去检查。
谢谢Parapura Rajkumar!

2 个答案:

答案 0 :(得分:2)

永远不会隐式生成比较运算符。只有这些东西是:

  • 默认构造函数,
  • 析构函数,
  • 复制并移动构造函数,
  • 复制分配和移动分配操作员

如果您希望能够比较类型,则必须编写自己的比较运算符。如果您将它们作为成员实现,那么它们应该被声明为const;否则,不可能比较常数对象。您也可以考虑将参数作为常量引用来避免不必要的复制;对于像这样的简单类型,它没什么区别,但对于大型或复杂的类可以更有效。类似的东西:

bool Outer::operator==(Outer const & rhs) const {
    return inner_.t == rhs.inner_.t;
}

或作为非会员职能:

bool operator==(Outer const & lhs, Outer const & rhs) {
    return lhs.inner_.t == rhs.inner_.t;
}

答案 1 :(得分:1)

您没有为operator==定义class Inner。所以你的代码应该是:

class Outer
{
    class Inner
    {
        int t;
    public:
        bool operator == (Inner inner)
        {
            return t == inner.t;
        }
    };
public:
    Inner inner_;
    bool operator == (Outer rightSide);
};

bool Outer::operator == (Outer rightSide)
{
    return inner_ == rightSide.inner_;
}