我写了两个自定义类,名为A
和B
我的B
类有一个成员变量a
,它有一个函数:
void B::setA(A s)
{
a = s;
}
然而,这一行给了我一个错误:
'operator =' function is unavailable in 'A'.
根据我的理解,这意味着编译器不会为我的A类创建默认的复制赋值函数。但是,我不明白为什么......我用A编写的唯一构造函数看起来像......
class A
{
//...
public:
A() {};
//...
};
现在实际上,A
和B
是包含大量成员变量的大型类,名称实际上不是A
和B
。如果没有发布这两个类的完整源代码,那么有人可以告诉我在尝试诊断该错误消息时可能会查找哪些类型的内容吗?为了清楚起见,我从不使用像这样的指针或低级功能,因此,据我所知,默认的副本分配应该适用于类A
。
编辑:
有人提到A的一个成员变量可能是罪魁祸首,所以这里有所有类型:
const std::string
static const bool
static std::map<int,std::string>
std::vector
std::map<int, C>
其中C是我在A所在的同一个头文件中定义的结构。它只包含一些整数和字符串。
答案 0 :(得分:1)
A类中有一个声明为
的非静态数据成员const std::string
与限定符const一起使用。在这种情况下,隐式复制赋值运算符由编译器定义为已删除。
答案 1 :(得分:1)
const
成员与复制赋值运算符不能很好地混合。编译器不仅不会为您生成一个,在语义上也难以提出一个实际上并不分配所有内容的“赋值”。
当然,没有什么可以阻止你编写一个没有分配给const
成员的赋值运算符,但这意味着以下两种情况之一:
mutable
而不是const
。