此类正在标记以下错误: '非静态const成员'const int成员:: membershipNo',不能使用默认赋值运算符'。奇怪的是这个代码在另一个项目中重复并完美运行。你能帮我把它搞定吗?
Member.h
class Member : public Person
{
public:
Member();
Member(int membershipNo);
virtual ~Member();
int getMembershipNo() const;
private:
const int membershipNo;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & boost::serialization::base_object<Person>(*this);
ar & membershipNo;
}
};
Member.cpp
Member::Member() : membershipNo(0)
{
Person();
}
Member::Member(int memberNo) : membershipNo(memberNo)
{
Person();
}
Member::~Member()
{
// TODO Auto-generated destructor stub
}
int Member::getMembershipNo() const
{
return membershipNo;
}
答案 0 :(得分:7)
据推测,您的代码中的某个位置正在分配给Member
,如下所示:
Member m1, m2;
m1 = m2;
或者您在要求类型可分配的上下文中使用它。
由于您没有为Member
提供自己的赋值运算符重载,因此隐式定义的默认赋值运算符通常会启动。但是,由于您有const
数据成员,编译器赢了“ t隐含地为你定义一个。您需要自己提供。
这是有道理的,因为在我刚刚给出的代码示例中,假设编译器应该对m1
的{{1}}成员做些什么?它应该为membershipNo
分配m2
吗?如果membershipNo
为membershipNo
,该怎么办呢?在这种情况下,编译器只是说“不,我不能这样做。”
如果
const
具有以下内容,则X
类的默认复制/移动分配运算符被定义为已删除:
X
非类型(或其数组)的非静态数据成员- [...]
正如我所说,为了能够使用const
进行作业,您需要提供自己的作业运算符:
Member
但是,这里存在Member& Member::operator=(const Member& other)
{
// Copy things from other to this
}
成员的问题。如果您按照描述提供自己的复制赋值运算符,并且不复制const
,那么您是否真的复制了另一个对象?从逻辑上讲,具有任何membershipNo
状态的对象不应该能够被分配给它。
然而,使用复制构造函数是完全正确的 - 您只需要确保在成员初始化列表中初始化const
:
membershipNo
然后你可以这样做:
Member::Member(const Member& other)
: membershipNo(other.membershipNo)
{
// ...
}
答案 1 :(得分:2)
发生的事情是某些客户端代码尝试将一个Member
实例分配给另一个实例。由于您有一个常量数据成员,因此无法使用。只有当某些代码尝试进行赋值时,才会出现错误,这就是为什么它可能看起来同一个类在另一个项目中“起作用”。
在正确的方面,选项是A)不执行赋值,或B)使数据成员非const。