.h的结构如何:
template <typename T>
class Node {
template <typename> friend class BST;
public:
Node(T p) : data(p), rlink(nullptr), llink(nullptr) {}
~Node() {}
private:
T data; // The holder of PACKET.
Node *rlink, *llink;
};
template <typename T>
class BST {
public:
BST();
void insert(T &p);
void inorderTraversal() const;
private:
Node<T> * root;
};
这是我将使用的可疑功能,出现问题的地方:
void inorderTraversal() const{
stack <T> *iterStack;
Node <T> *currentNode = root;
iterStack->push(currentNode);
}
错误:
'void std :: stack >> :: push(const Packet&)':无法将参数1从“节点*”转换为“ Packet &&”
如何解决这个问题,以便堆栈可以容纳我的节点?
请注意,Packet是由Node的私有成员T data
接收的对象。
Packet.h(供参考):
class Packet {
public:
Packet(int partId, string description, double price, int partCount) :
partId(partId), description(description), price(price), partCount(partCount) {}
int getPartId() const { return partId; }
string getDescription() const { return description; }
double getPrice() const { return price; }
int getPartCount() const { return partCount; }
private:
int partId;
string description;
double price;
int partCount;
};
更新:
尝试
template <typename T>
void BST<T>::inorderTraversal() const{
stack <Node<T> *> iterStack;
Node <T> *currentNode = root;
iterStack->push(currentNode);
}
出现错误:
'std :: stack *,std :: deque <_Ty,std :: allocator <_Ty >>>'不 成员'operator->'
具有超载'std :: stack *,std :: deque <_Ty,std :: allocator <_Ty >>> :: push': 左操作数具有“类”类型,请使用“。”
答案 0 :(得分:1)
如有疑问,请替换您头脑中的模板参数,并考虑生成的代码。例如,如果出于您的目的,T
是Packet
,则此:
std::stack<T> *iterStack;
Node <T> *currentNode = root;
iterStack->push(currentNode);
将与
同义std::stack<Packet> *iterStack;
Node <Packet> *currentNode = root;
iterStack->push(currentNode);
很显然,此代码已被删减(仅因为显然是 yours ),所以人们可以理智地质疑iterStack
是否首先必须是动态的。顺便说一句,不是)。
无论如何,显然std::stack<Packet>
不能容纳Node<Packet>*
个对象;但是std::stack< Node<Packet>* >
可以。即
std::stack< Node<T> > *iterStack;
Node <T> *currentNode = root;
iterStack->push(currentNode);
此外,很可能您的堆栈一开始不需要本身就是动态的。
std::stack< Node<T>* > stk;
Node <T> *currentNode = root;
stk.push(currentNode);