我正在使用C ++编写模板程序,但我无法弄清楚它为什么不编译。
我有班级节点:
template<typename T>
class Node {
friend class Tree<T>;
public:
using nodePtr = std::shared_ptr<Node<T>>;
Node(T value):
nodeValue(value),
leftSon(Node()),
rightSon(Node()),
isEmpty(false) {
}
Node(T value, nodePtr left, nodePtr right):
nodeValue(value),
leftSon(left),
rightSon(right),
isEmpty(false) {
}
Node():
nodeValue(T()),
leftSon(nullptr),
rightSon(nullptr),
isEmpty(true) {
}
Node(nodePtr root):
nodeValue(root->nodeValue),
leftSon(root->leftSon),
rightSon(root->rightSon),
isEmpty(root->isEmpty) {
}
Node(const nodePtr& copied):
nodeValue(copied.nodeValue),
leftSon(copied.leftSon),
rightSon(copied.rightSon),
isEmpty(copied.isEmpty) {
}
private:
T nodeValue;
nodePtr leftSon;
nodePtr rightSon;
bool isEmpty;
};
和树:
template<typename T>
class Tree {
using nodePtr = std::shared_ptr<Node<T>>;
nodePtr root;
public:
static nodePtr createEmptyNode() {
return std::make_shared<Node<T>>();
}
static nodePtr createValueNode(T value) {
return std::make_shared<Node<T>>(value);
}
static nodePtr createValueNode(T value, nodePtr left, nodePtr right) {
return std::make_shared<Node<T>>(value, left, right);
}
};
当我使用
时Tree<int>::createValueNode(7);
在main函数中,Visual Studio编译器以错误结束:
C2664
'std::shared_ptr<Node<T>>::shared_ptr(std::shared_ptr<Node<T>> &&) noexcept':
cannot convert argument 1 from 'Node<T>' to 'std::nullptr_t'
答案 0 :(得分:1)
错误信息确实不清楚。 clang one更好:
错误:没有用于初始化&#39;
v
&#39;的匹配构造函数(又名nodePtr
&#39;)
shared_ptr<Node<int> >
错误就在这里
leftSon(Node()),
^ ~~~~~~
应该是:
Node(T value):
nodeValue(value),
leftSon(Node()), // <-
rightSon(Node()), // <-
isEmpty(false) {
}
取决于你想要的。
答案 1 :(得分:0)
正如评论中指出的那样,问题是Node类中的第一个构造函数。您可以使用如下所示的空值更改它:
Node(T value):
nodeValue(value),
leftSon(nullptr),
rightSon(nullptr),
isEmpty(false) {
}
您还可以使用新的Node类进行初始化:
Node(T value):
nodeValue(value),
leftSon(new Node()),
rightSon(new Node()),
isEmpty(false) {
}
您将使用的解决方案取决于函数的含义。