'类型非静态const成员不能使用默认赋值运算符' - 这是什么意思?

时间:2013-02-22 18:38:34

标签: c++ const

此类正在标记以下错误: '非静态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;
}

2 个答案:

答案 0 :(得分:7)

据推测,您的代码中的某个位置正在分配给Member,如下所示:

Member m1, m2;
m1 = m2;

或者您在要求类型可分配的上下文中使用它。

由于您没有为Member提供自己的赋值运算符重载,因此隐式定义的默认赋值运算符通常会启动。但是,由于您有const数据成员,编译器赢了“ t隐含地为你定义一个。您需要自己提供。

这是有道理的,因为在我刚刚给出的代码示例中,假设编译器应该对m1的{​​{1}}成员做些什么?它应该为membershipNo分配m2吗?如果membershipNomembershipNo,该怎么办呢?在这种情况下,编译器只是说“不,我不能这样做。”

  

如果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。