我有一个类,我知道它编译失败的原因:
// 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
中创建一个复制赋值运算符。