我遇到一些麻烦,弄清楚为什么我似乎无法使用我自己的类对象的向量使用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;
}
答案 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您不应提供自定义复制或移动赋值运算符(也不是析构函数)。