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

No viable '=' when using vector::erase

我在弄清楚为什么我似乎无法 std::vector::erase 使用我自己的 class 对象的矢量时遇到了一些麻烦。下面的代码抛出一个 "No viable overloaded '='" 错误,并且在经过大量搜索 overflow/tutorialspoint/...

后无法找出原因

我的 class 定义 '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;
}

std::vector::erase 添加了向量元素的类型 T 必须是 move assignable 的要求。这特别意味着像 t = rv 这样的表达式必须具有 T & 的 return 类型(引用 T)和 t 的值(因此 returned reference must reference the assigned to object).

您的 Node::operator= 具有 return 类型 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 class确实(应该)处理所有权(std::vector正在为您做这件事),因此根据rule of zero 您不应提供自定义复制或移动赋值运算符(也不应提供析构函数)。