“无法将参数 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'
【问题讨论】:
你使用哪个编译器? 尝试编写错误信息确实不清楚。铿锵声更好:
错误:'
nodePtr
'(又名shared_ptr<Node<int> >
')的初始化没有匹配的构造函数
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” 编译器错误的主要内容,如果未能解决你的问题,请参考以下文章