类成员有自己的常量成员,因此隐式删除了构造函数

时间:2016-05-18 12:33:23

标签: c++

我有一个班级,我知道为什么它无法编译:

// My class .hpp
class MyClass
{
public:
    MyClass();
    MyClass(/*yet another constructor*/);

private:
    FOO::Dependancy dep_1;
};

// Dependancy.hpp
namespace FOO {
    class Dependancy : public Parent
    {
    public:
        Dependancy(const Bar& _bar);
        ~Dependancy();

        virtual int method_1(/*bla*/);
        virtual int method_1(/*bla bla*/);    

    private:
        const Bar _bar;
    };
}

如您所见,依赖类具有const成员。所以在编译时,(与g ++不同)clang ++告诉我代码究竟出了什么问题:

1. error: object of type 'MyClass' cannot be assigned because its copy assignment operator is implicitly deleted
2. copy assignment operator of 'MyClass' is implicitly deleted because field 'dep_1' has a deleted copy assignment operator
3. copy assignment operator of 'Dependancy' is implicitly deleted because field '_bar' has no copy assignment operator

我的问题是,如何解决问题,知道FOO::Dependancy及其自己的成员(即Bar)等等,是我无法访问的静态库他们的源代码。换句话说,我无法对那个const成员做任何事情,我必须在我自己的课堂上解决这个问题。

1 个答案:

答案 0 :(得分:1)

错误非常清楚

  

“MyClass”类型的对象无法分配,因为其隐式删除了其复制赋值运算符

因此,隐式删除了复制分配,您必须自己指定/创建一个。

删除它的原因是dep_1,因为您可以从第二个错误中看到

  

'MyClass'的复制赋值运算符被隐式删除,因为字段'dep_1'具有已删除的复制赋值运算符

现在,如果您想知道为什么dep_1没有复制赋值运算符,请查看第三个错误:

  隐式删除

归结为_bar类型Bar没有复制赋值运算符,因为它已被定义为const

正如您所说,您无法更改班级Dependancy,因此唯一的解决方案是自己在MyClass创建一个复制赋值运算符。