gpt4 book ai didi

c++ - 构造函数模板调用 'no matching function to call'

转载 作者:行者123 更新时间:2023-11-28 06:14:51 24 4
gpt4 key购买 nike

我目前正在为一个如下所示的项目编写树数据结构:

template<typename T>
class tree
{
public:
tree(T const&);
// ...
private:
// ...
std::auto_ptr<node<T>> mRoot;
};


template<typename T>
tree<T>::tree(T const& data):
mDepth(0),
mRoot(nullptr)
{
mRoot = new node<T>(data, nullptr, nullptr, nullptr, nullptr, nullptr);
}

为了创建根节点,构造函数应该使用数据作为输入来初始化树。

节点构造函数如下所示:

template<typename T>
struct node
{
// constructor & destructor
node(T const&,
std::auto_ptr<node<T>>,
std::auto_ptr<node<T>>,
std::auto_ptr<node<T>>,
std::auto_ptr<node<T>>,
std::auto_ptr<node<T>>);

// member
T data;
std::auto_ptr<node<T>> parent;
std::auto_ptr<node<T>> firstChild, lastChild;
std::auto_ptr<node<T>> nextSibling, prevSibling;
int numChildren;
};

template<typename T>
node<T>::node(T const& data,
std::auto_ptr<node<T>> parent,
std::auto_ptr<node<T>> firstChild,
std::auto_ptr<node<T>> lastChild,
std::auto_ptr<node<T>> nextSibling,
std::auto_ptr<node<T>> prevSibling):
data(data),
parent(nullptr),
firstChild(nullptr),
lastChild(nullptr),
nextSibling(nullptr),
prevSibling(nullptr),
numChildren(nullptr)
{}

但是如果我尝试像这样在我的主函数中调用它

int foo = 1;
tree<int> mytree = tree<int>(foo);

失败并出现以下错误:

tree.h: In instantiation of 'tree<T>::tree(const T&) [with T = int]':
main.cpp:9:35: required from here
tree.h:39:9: error: no matching function for call to 'node<int>::node(const int&, std::nullptr_t, std::nullptr_t, std::nullptr_t, std::nullptr_t, std::nullptr_t)'
mRoot = new node<T>(data, nullptr, nullptr, nullptr, nullptr, nullptr);

主要问题是我重用了旧的自行实现链表中的结构,其中一切正常。

也许我只是盲目地发现了主要错误,但如果你们中有人对此有想法,那就太好了。

最佳答案

std::auto_ptr 没有指针类型的隐式转换,这意味着这种初始化是不允许的:

std::auto_ptr<node<T>> n = nullptr;

您可以通过将相关的构造函数签名更改为来解决眼前的问题

node(T const&, node*, node*, node*, node*, node*); 

请注意,您的构造函数实现甚至没有尝试使用 auto_ptr 参数。如果配置合适,你的编译器应该给你警告。大概你想做这样的事情:

template<typename T>
node<T>::node(T const& data,
node<T>* parent,
node<T>* firstChild,
node<T>* lastChild,
node<T>* nextSibling,
node<T>* prevSibling):
data(data),
parent(parent),
firstChild(firstChild),
lastChild(lastChild),
nextSibling(nextSibling),
prevSibling(prevSibling),
numChildren(numChildren)
{}

最后,请注意 std::auto_ptr 在 C++11 中已弃用。如果您可以使用比 C++03 更新的方言,请考虑 std::unique_ptr

关于c++ - 构造函数模板调用 'no matching function to call',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com