【问题标题】:Pre and post increment operators in different classes不同类中的前置和后置增量运算符
【发布时间】:2015-02-20 05:53:34
【问题描述】:

我想创建重载运算符的特征,以避免代码重复。但是当我尝试将前置和后置增量运算符放在不同的类中时,编译器会给我一个错误:“运算符 ++ 不明确”代码:

class A
{
    public: 
    A& operator++(){return *this;}
};

class B
{
    public:
    B operator++(int){return *this;}        
};

class C:public A, public B
{
};

int main()
{
    C c;
    c++;
    ++c;
}

在我的情况下,可以从 A 继承 B,但是编译器找不到后增量运算符。为什么会出现这种情况,正确的方法是什么?

【问题讨论】:

  • Clang 接受代码。 GCC 错误?
  • 如果 B 继承自 A,那么您在这种情况下看到的是 name hidden
  • @immibis 谢谢,谷歌搜索后,我已将using A::operator++; 添加到B 课程中,并且成功了。
  • @Brian 似乎是这样。 gcc.goodbolt 上所有版本的 gcc 都拒绝编译此代码。

标签: c++ operator-overloading


【解决方案1】:

GCC 拒绝该代码,因为它首先执行名称查找而不考虑参数列表,并且该名称在两个基类中找到。 Clang 接受代码,但这是由错误引起的。

解决方案是添加using,并创建一个单独的类,从A和B继承,然后从该类继承C。

class A
{
    public: 
    A& operator++(){return *this;}
};

class B
{
    public:
    B operator++(int){return *this;}        
};

class AAndB:public A, public B
{
    public:
    using A::operator++;
    using B::operator++;
};

class C:public AAndB
{
};

int main()
{
    C c;
    c++;
    ++c;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2016-02-02
    • 2012-03-07
    • 2012-07-11
    • 1970-01-01
    • 2011-03-17
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多