C++14 无法调用从唯一指针继承的 class 的复制构造函数或运算符=
C++14 can not call copy constructor or operator= of class inheriting from unique pointer
我在调用 constructor/operator 时遇到问题。我有一个 class 树,它是一个指向节点的唯一指针。这是我实现移动和复制的代码 constructor/operator.
template <class Key, class Data>
class Node;
template <class Key, class Data>
class Tree : public unique_ptr<Node<Key, Data>>
{
using unique_ptr<Node<Key, Data>>::unique_ptr;
public:
/*Default empty constructor*/
Tree(){
this->reset();
}
/*Default constructor*/
Tree(const Key& key, const Data& data) : unique_ptr<Node<Key, Data>>(make_unique<Node<Key, Data>>(key, data)) {
}
/*Copy constructor*/
Tree(const unique_ptr<Node<Key, Data>>& tree) : unique_ptr<Node<Key, Data>>(nullptr){
if(tree){
this->reset(new Node<Key, Data>(*tree));
}
}
/*Move constructor: roep de move constructor van unique_ptr op*/
Tree(unique_ptr<Node<Key, Data>>&& tree) : unique_ptr<Node<Key, Data >>(move(tree)) {
}
/*Copy operator*/
Tree<Key, Data>& operator=(const unique_ptr<Node<Key, Data>>& tree) {
if (this != &tree) {
this->reset(make_unique(Tree<Key, Data>(*tree)));
if ((*this)->left != nullptr) {
(*this)->left = tree->left;
}
if ((*this)->right != nullptr) {
(*this)->right = tree->right;
}
}
return *this;
}
/*Move operator*/
Tree<Key, Data>& operator=(unique_ptr<Node<Key, Data >>&& tree) {
if (this != &tree) {
*this = unique_ptr<Key, Data>::operator=(std::move(tree));
}
return *this;
}}
当我尝试使用构造函数或 operator= 将树 a 复制到树 b 时,我收到一条错误消息,告诉我运算符已被隐式删除。我知道当你实现 move/copy constructor/operator 时,默认的就不能再使用了,你也必须实现所有其他的。但从我的角度来看,我实现了所有这些。
代码示例
Tree<int, char> tree;
Tree<int, char> copy;
copy = tree;
错误:'Tree' 类型的对象无法赋值,因为它的复制赋值运算符被隐式删除
您的 "move constructor" 和 "copy assignment operator" 没有正确的签名。它们应该是 Tree(Tree&&)
和 Tree& operator=(const Tree&)
。
当您执行 copy = tree;
时,会使用 none 的函数,但会选择编译器生成的默认赋值运算符。这恰好被删除了 (= delete;
) 因为基础 class' 复制分配被删除了。
我在调用 constructor/operator 时遇到问题。我有一个 class 树,它是一个指向节点的唯一指针。这是我实现移动和复制的代码 constructor/operator.
template <class Key, class Data>
class Node;
template <class Key, class Data>
class Tree : public unique_ptr<Node<Key, Data>>
{
using unique_ptr<Node<Key, Data>>::unique_ptr;
public:
/*Default empty constructor*/
Tree(){
this->reset();
}
/*Default constructor*/
Tree(const Key& key, const Data& data) : unique_ptr<Node<Key, Data>>(make_unique<Node<Key, Data>>(key, data)) {
}
/*Copy constructor*/
Tree(const unique_ptr<Node<Key, Data>>& tree) : unique_ptr<Node<Key, Data>>(nullptr){
if(tree){
this->reset(new Node<Key, Data>(*tree));
}
}
/*Move constructor: roep de move constructor van unique_ptr op*/
Tree(unique_ptr<Node<Key, Data>>&& tree) : unique_ptr<Node<Key, Data >>(move(tree)) {
}
/*Copy operator*/
Tree<Key, Data>& operator=(const unique_ptr<Node<Key, Data>>& tree) {
if (this != &tree) {
this->reset(make_unique(Tree<Key, Data>(*tree)));
if ((*this)->left != nullptr) {
(*this)->left = tree->left;
}
if ((*this)->right != nullptr) {
(*this)->right = tree->right;
}
}
return *this;
}
/*Move operator*/
Tree<Key, Data>& operator=(unique_ptr<Node<Key, Data >>&& tree) {
if (this != &tree) {
*this = unique_ptr<Key, Data>::operator=(std::move(tree));
}
return *this;
}}
当我尝试使用构造函数或 operator= 将树 a 复制到树 b 时,我收到一条错误消息,告诉我运算符已被隐式删除。我知道当你实现 move/copy constructor/operator 时,默认的就不能再使用了,你也必须实现所有其他的。但从我的角度来看,我实现了所有这些。
代码示例
Tree<int, char> tree;
Tree<int, char> copy;
copy = tree;
错误:'Tree' 类型的对象无法赋值,因为它的复制赋值运算符被隐式删除
您的 "move constructor" 和 "copy assignment operator" 没有正确的签名。它们应该是 Tree(Tree&&)
和 Tree& operator=(const Tree&)
。
当您执行 copy = tree;
时,会使用 none 的函数,但会选择编译器生成的默认赋值运算符。这恰好被删除了 (= delete;
) 因为基础 class' 复制分配被删除了。