使用vector :: erase时没有可行的'='

时间:2017-04-08 21:38:28

标签: c++ vector assignment-operator

我遇到一些麻烦,弄清楚为什么我似乎无法使用我自己的类对象的向量使用std :: vector :: erase。以下代码抛出“没有可行的重载'='”错误,并且无法弄清楚为什么经过一些广泛的搜索溢出/ tutorialspoint /...

我的班级定义'MyClass.hpp':

#include <string>
#include <vector>
class node;
class graph{
public:
    graph();
    std::vector<node> nodeList;
};

class node{
public:
    node(std::string name) : name(name){};
    void operator=(node& rhs);
    std::string name;
    std::vector<node> adjacent;
};

void node::operator=(node& rhs){
    name = rhs.name;
    adjacent = rhs.adjacent;
}

和我的主文件:

#include "MyClass.hpp"
int main(int argc, const char * argv[]) {
    node node1("root"), node2("leaf");
    node1.adjacent.push_back(node2);
    node2.adjacent.push_back(node1);
    node1.adjacent.erase(node1.adjacent.begin());
    graph myGraph;
    return 0;
}

1 个答案:

答案 0 :(得分:5)

std::vector::erase添加了向量元素的T类型必须为move assignable的要求。这尤其意味着像t = rv这样的表达式的返回类型必须为T &(对T的引用)和值t(因此返回的引用必须引用分配给对象)。

您的Node::operator=返回类型为void,因此违反了上述要求。此外,复制/移动赋值运算符的通常(也可能是最合理的)类型签名如下:

T & operator=(T &&); // move assignment
T & operator=(T); // copy assignment, pass by value
T & operator=(T const &); // copy assignment, pass by const reference

但是,您应该一起放弃,而不是修复您的运营商!您的Node班级确实(应该)处理所有权(std::vector正在为您执行此操作),因此根据rule of zero您不应提供自定义复制或移动赋值运算符(也不是析构函数)。