从 '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;
}
我对这样的对象赋值有问题:
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;
}