&#34;无法从&lt; Node <t>&#39;转换参数1到&#39; std :: nullptr_t&#34;编译器错误

时间:2017-01-26 12:43:44

标签: c++ visual-studio c++11

我正在使用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'

2 个答案:

答案 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) {
}

您将使用的解决方案取决于函数的含义。