C ++用户定义的类复制分配缺失?

时间:2014-03-02 16:40:52

标签: c++

我写了两个自定义类,名为AB 我的B类有一个成员变量a,它有一个函数:

void B::setA(A s)
{
    a = s;
}

然而,这一行给了我一个错误:

'operator =' function is unavailable in 'A'.

根据我的理解,这意味着编译器不会为我的A类创建默认的复制赋值函数。但是,我不明白为什么......我用A编写的唯一构造函数看起来像......

class A
{
    //...
public:
    A() {};
    //...
};

现在实际上,AB是包含大量成员变量的大型类,名称实际上不是AB。如果没有发布这两个类的完整源代码,那么有人可以告诉我在尝试诊断该错误消息时可能会查找哪些类型的内容吗?为了清楚起见,我从不使用像这样的指针或低级功能,因此,据我所知,默认的副本分配应该适用于类A

编辑:

有人提到A的一个成员变量可能是罪魁祸首,所以这里有所有类型:

const std::string
static const bool
static std::map<int,std::string>
std::vector
std::map<int, C>

其中C是我在A所在的同一个头文件中定义的结构。它只包含一些整数和字符串。

2 个答案:

答案 0 :(得分:1)

A类中有一个声明为

的非静态数据成员
const std::string

与限定符const一起使用。在这种情况下,隐式复制赋值运算符由编译器定义为已删除。

答案 1 :(得分:1)

const成员与复制赋值运算符不能很好地混合。编译器不仅不会为您生成一个,在语义上也难以提出一个实际上并不分配所有内容的“赋值”。

当然,没有什么可以阻止你编写一个没有分配给const成员的赋值运算符,但这意味着以下两种情况之一:

  1. 指定的对象在客户端中不会显示为源的相同副本,这不是除了复制赋值运算符之外的副本,因此会出现运算符重载滥用的情况。
  2. 成员变量对外部没有可观察的效果。在这种情况下,人们必须想知道为什么它首先存在,或者更确切地说它不是mutable而不是const