我目前正在为这样的项目编写树数据结构:
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);
主要的问题是我从一个旧的自我实现的链表中重用了这个结构,一切正常。
也许我只是盲目地找到了主要的错误,但如果你们其中一个人对此有所了解,那就太好了。
答案 0 :(得分:1)
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)
{}
最后,请注意在C ++ 11中不推荐使用std::auto_ptr
。如果您可以使用比C ++ 03更新的方言,请考虑std::unique_ptr
。