C++ 继承和赋值运算符

C++ inheritance and assignment operator

提问人:Hrant Nurijanyan 提问时间:3/9/2021 更新时间:3/9/2021 访问量:147

问:

我正在使用 CRTP 来实现 C++ 功能。

现在我遇到了这样的情况。

template<typename T>
struct A {
    char a;

    T operator+(const T& other){
        T t;
        t.a = a + other.a;
        return t;
    }
};

struct B : A<B>{

};

struct C : B {
    C& operator=(const C& other){
        a = other.a;
        return *this;
    }
};

int main() {
    C c1,c2,c3;
    c3 = c1 + c2;
    return 0;
}

此代码不编译说no viable overloaded=

如何在不向 和 添加任何代码的情况下解决问题?struct Astruct B

C++ 继承 赋值-运算符 CRTP

评论


答:

3赞 RoQuOTriX 3/9/2021 #1

您需要创建 assign 运算符,该运算符作为参考:B

struct C : B {
    C& operator=(const C& other){
        return *this = static_cast<const B&>(other);
    }

    C& operator=(const B& other){
        a = other.a;
        return *this;
    }
};

简短解释为什么你需要这个(我希望我没有错):

返回一个引用,就像模板参数一样,而不是 .因此,忽略将有一个不可能的分配。需要明确的是,您不需要第一个赋值运算符来运行您的代码。+ operatorBBC+C = B

也许这也更清晰更好:

struct C : B {
    B& operator=(const B& other){
        a = other.a;
        return *this;
    }
};

现在,赋值运算符将作为输入和输出。B

1赞 Pat. ANDRIA 3/9/2021 #2

您还可以重载 for the 以允许代码返回对象而不是对象(由于类中定义了 而当前这样做)。这样,你就可以得到一个对象,因为该对象可以使用在类中定义来分配。operator+C classc1 + c2CBoperator+BCc1+c2operator=C

例如,将此函数添加到以下内容中:C class

C& operator+(const C& other){
        // for example add the two operands' characters
        this->a += other.a;
        return *this;
    }

但要小心你选择背后的想法,因为它可能会编译,但不会做你想做的事情。

重载 或 可能取决于您要对代码执行的操作以及要从操作中获取的类型。+=c1+c2