为什么我在以下代码中获得error: no match for ‘operator=’ in ‘y = x’
?
不能将b的a分量分配给它a-object = a-object
?
struct a {int i;};
struct b : public a {int j;};
int main()
{
a x;
b y;
x.i = 9;
y.j = 5;
y = x; // error: no match for ‘operator=’ in ‘y = x’
// expected: y.i = 9
return 0;
}
答案 0 :(得分:1)
您没有明确定义任何赋值运算符,因此编译器将为每个结构生成自己的默认运算符。 b
中编译器的默认赋值运算符将b
作为输入,并将分配两个成员。使用继承时,并不会自动继承赋值运算符。这就是您无法将a
传递给b
的原因 - b
中没有以a
作为输入的赋值运算符。如果你想允许,你需要告诉编译器,例如:
struct a
{
int i;
a& operator=(const a &rhs)
{
i = rhs.i;
return *this;
}
};
struct b : public a
{
int j;
using a::operator=;
b& operator=(const b &rhs)
{
*this = static_cast<const a&>(rhs);
j = rhs.j;
return *this;
}
};
int main()
{
a x;
b y;
b z;
...
y = x; // OK now
y = z; // OK as well
...
return 0;
}
答案 1 :(得分:0)
不,因为即使这些类是相关的,它们也是不同的类型。
考虑一下,即使它被允许并且它会像您预期的那样工作,y.j
在作业之后的价值是什么?
答案 2 :(得分:0)
如错误所述,您需要实现赋值运算符。也就是说,这个函数告诉程序如何将一个对象分配给另一个对象。如果您在网上搜索,可以找到大量信息,例如:在http://www.cplusplus.com/articles/y8hv0pDG/