ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:08:04 24 4
gpt4 key购买 nike

我在弄清楚为什么我似乎无法让 std::vector::erase 与我自己的类对象的 vector 一起工作时遇到了一些麻烦。下面的代码抛出一个"No viable overloaded '='" 错误,并且在一些广泛的搜索 overflow/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;
}

最佳答案

std::vector::erase 添加了 vector 元素的类型 T 必须为 move assignable 的要求。这尤其意味着像 t = rv 这样的表达式必须具有 T & 的返回类型(对 T 的引用)和 的值code>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 你不应提供自定义复制或移动赋值运算符(也不应提供析构函数)。

关于c++ - 使用 vector::erase 时没有可行的 '=',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43300626/

24 4 0
文章推荐: android - 如何在 android studio 中创建一个 c++ 类(.h 和 .cpp)?
文章推荐: c++ - 指针和数组 [指向 int 的指针与指向 char 的指针]
文章推荐: c++ - 为什么不区分大小写与 std::unordered_set 的 std::hash 函数一起使用?
文章推荐: java - Android,删除圆形进度条周围的方形边框
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
全站热门文章
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com