“无法将参数 1 从 'Node<T>' 转换为 'std::nullptr_t” 编译器错误

Posted

技术标签:

【中文标题】“无法将参数 1 从 \'Node<T>\' 转换为 \'std::nullptr_t” 编译器错误【英文标题】:"cannot convert argument 1 from 'Node<T>' to 'std::nullptr_t" compiler error“无法将参数 1 从 'Node<T>' 转换为 'std::nullptr_t” 编译器错误 【发布时间】:2017-01-26 12:43:43 【问题描述】:

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

【问题讨论】:

你使用哪个编译器? 尝试编写 > - 在>>之间添加空格符号 我不知道它是什么调试器。在选项中,我看到“要启动的调试器:本地 Windows 调试器”。 用'> >'也有同样的错误 我认为问题出在 Node 类的第一个构造函数中。尝试将nullptr分配给左右子,看看是否编译。 【参考方案1】:

错误信息确实不清楚。铿锵声更好:

错误:'nodePtr'(又名shared_ptr&lt;Node&lt;int&gt; &gt;')的初始化没有匹配的构造函数

leftSon(Node()),  
^       ~~~~~~

错误在这里

Node(T value):
    nodeValue(value),
    leftSon(Node()), // <-
    rightSon(Node()), // <-
    isEmpty(false) 

应该是:

Node(T value):
    nodeValue(value),
    leftSon(),
    rightSon(),
    isEmpty(false) 

取决于你想要什么。

【讨论】:

从我迟到 5 分钟的评论中复制。 @KakamiOkatsu:老实说,我在使用 clang/gcc 编译找到解决方案后看到了您的评论。【参考方案2】:

正如评论中所指出的,问题是 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) 

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

【讨论】:

以上是关于“无法将参数 1 从 'Node<T>' 转换为 'std::nullptr_t” 编译器错误的主要内容,如果未能解决你的问题,请参考以下文章