无法将元素插入包含引用的类的向量中

时间:2018-06-25 03:14:15

标签: c++ vector stl

我有一个类,它引用了另一个结构。

struct DNA { ... };
class Cohort {
    private:
        DNA& genetics;
        ...
    public:
        Cohort(DNA& g) : genetics(g) {}
        ...
};

然后我有一个Cohort s的向量。

std::vector<Cohort> cohorts;

然后我必须在向量的开头插入同类群组。

cohorts.insert(cohorts.begin(), Cohort(eggs, genetics));    

我得到一个错误。

error: object of type 'Thor_Lucas_Development::Cohort' cannot be assigned because its copy assignment
      operator is implicitly deleted

我假设将项目插入到向量中时,将其复制进来。由于我在Cohort的类中有一个引用,因此它的复制分配运算符被隐式删除。

所以...发生了什么事?在处理Cohort类时,我只是不能使用向量?还是必须我在newCohort并在向量中有指向它的指针?

有点烦人。

2 个答案:

答案 0 :(得分:1)

您可以就地构建对象:

cohorts.emplace(cohorts.begin(), eggs, genetics); 

但是引用成员很少是一个好主意-改用指针。
而且,如果您多次插入开头,则可能需要std::deque而不是std::vector

答案 1 :(得分:0)

如错误消息所述,您不能在活动对象中重新绑定引用,这就是默认情况下删除分配的原因。

除了将指针存储在向量中之外,您还可以以某种方式重写您的类:

I。使用指针而不是引用。在此用例中,它们非常像值:

#include <vector>

struct Nyan {
    int *x;
};

int main() {
    int x;
    std::vector<Nyan> v{{&x}, {&x}, {&x}};
    v.insert(v.begin(), Nyan{&x});
}

(作为参考的替代品,普通指针完全可以,但是如果需要,可以使用<memory>中定义的任何包装器。)

您甚至可以添加一些保护以禁止空指针:

struct Nyan {
    Nyan(int &x): x(&x) {}
private:
    int *x;
};

II。 std::reference_wrapper最早是在C ++ 11中引入的,以适应不可重新绑定性,以便将引用存储在容器中:

#include <vector>
#include <functional>

struct Nyan {
    std::reference_wrapper<int> x;
};

int main() {
    int x;
    std::vector<Nyan> v{{x}, {x}, {x}};
    v.insert(v.begin(), Nyan{x});
}