繁体   English   中英

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

[英]'Type non-static const member can't use default assignment operator' - what does this mean?

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

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

Member m1, m2;
m1 = m2;

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

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

这是有道理的,因为在我刚给出的代码示例中想象一下,编译器应该对m1membershipNo成员做什么? 它应该分配m2membershipNo吗? 如果membershipNoconst ,它怎么能这样做呢? 在这种情况下,编译器只是说“不,我不能这样做”。

如果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)
{
  // ...
}

然后你可以这样做:

Member m1;
Member m2 = m1;

发生的事情是某些客户端代码试图使用一个Member实例分配给另一个Member实例。 由于您有一个常量数据成员,因此无法使用。 只有当某些代码尝试进行赋值时,才会出现错误,这就是为什么它可能看起来同一个类在另一个项目中“起作用”。

在正确的方面,选项是A)不执行赋值,或B)使数据成员非const。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM