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



我有一个类,我知道它编译失败的原因:

// 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成员无能为力,我必须在自己的类中解决这个问题。

错误非常明显

无法分配"MyClass"类型的对象,因为其副本分配运算符已隐式删除

因此,副本分配被隐式删除,您必须自己指定/创建一个。

它被删除的原因是因为dep_1,正如你从第二个错误中看到的那样

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

现在,如果您想知道为什么dep_1没有拷贝分配运算符,请查看第三个错误:

"Dependency"的复制赋值运算符被隐式删除,因为字段"_bar"没有复制赋值运算符

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

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

最新更新