使用 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 您不应提供自定义复制或移动赋值运算符(也不应提供析构函数)。
我在弄清楚为什么我似乎无法 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 您不应提供自定义复制或移动赋值运算符(也不应提供析构函数)。