从 'int' 到非标量类型赋值运算符的转换 - 对象到 int

Conversion from 'int' to non-scalar type assignment operator - object to int

我对这样的对象赋值有问题:

int main() {
     Wurzel a;  
     Wurzel b=3; // error: conversion from 'int' to non-scalar type 'Wurzel' requested

     return 0;
}

我的 class 赋值运算符:

class Wurzel{
private:
    int wurzelexponent;
    int wert;

public:

    Wurzel(){
        wurzelexponent=1;
        wert=1;
    }

    Wurzel& operator =(const Wurzel &w)  {

        wurzelexponent = w.wurzelexponent;

    }
};

我必须使用 = 运算符

问题出在哪里?

I must do this with = operator

不,你不能。因为Wurzel b=3;不是赋值,是初始化,copy initialization. As the error message said, you need a converting constructor完成。

class Wurzel{
    ...
public:
    ...
    Wurzel(int x) : wurzelexponent(x), wert(1) {}
    Wurzel(int x, int y) : wurzelexponent(x), wert(y) {}
    ...
};

然后

Wurzel b = 3;      // Wurzel::Wurzel(int) will be called
Wurzel b = {3, 2}; // Wurzel::Wurzel(int, int) will be called [1]

注意operator=只用于赋值,如:

Wurzel b;      // default initialized
b = something; // this is assignment, operator=() will be used

[1] 从 C++11 引入了多参数转换构造函数。

您正在尝试赋值一个整数:Wurzel b=3;,但您的 operator= 仅针对 const Wurzel &w 超载。它的参数是 Wurzel,不是 int 并且 int 不能隐式转换为 Wurzel。要修复,您可以添加另一个运算符:

Wurzel& operator =(int i)
{}

问题是需要的函数没有定义。

一个解决方案是重载 = 运算符以接受 int.

试试这个:

class Wurzel{
private:
    int wurzelexponent;
    int wert;

public:

    Wurzel(){
        wurzelexponent=1;
        wert=1;
    }
    // this is constructor, not = operator
    /*
    Wurzel(int a) {
        wurzelexponent = a;
        wert = a;
    }
    */

    Wurzel& operator =(const Wurzel &w)  {

        wurzelexponent = w.wurzelexponent;
        return *this; // you should return something

    }
    Wurzel& operator=(int a) {
        // implement as you like
        wurzelexponent = a;
        return *this;
    }
};

int main() {
    Wurzel a;
    // this is not = operator but initializing
    //Wurzel b=3;

    Wurzel b;
    b = 3; // this is = opetator, which you say you must use

    return 0;
}