【发布时间】:2020-04-08 06:53:22
【问题描述】:
在以下代码中,我有一个无法解决的疑问和错误:
在
class BST之外定义函数root()时,为什么一定要使用typename bst::Node*?如果BST没有被模板化,我就可以只使用BST::Node对吗?在类外为
BST重载operator<<时会引发以下错误:
架构 x86_64 的未定义符号: “operator&, BST::Node*)”,引用自: bst_raw.cpp.o 中的 BST::inorderTreeWalk(BST::Node*) ld:未找到架构 x86_64 的符号
有人可以帮我解答疑惑吗?
#define T template <typename K, typename V>
#define bst BST<K,V>
T
class BST {
public:
class Node;
private:
Node* _root;
public:
BST():_root(NULL) {};
bool empty() ;
Node* root();
void set_root(Node* z);
void insert(K key, V value);
void inorderTreeWalk(Node* x);
};
T
class bst::Node {
public:
Node(K k, V v) : _key(k), _val(v) {};
K key() const { return _key; }
V val() const { return _val; }
Node* left() { return l;}
void set_left(Node* n) { l = n;}
Node* right() { return r;}
void set_right(Node* n) { r = n; }
Node* parent();
void set_parent(Node* n) { p = n; }
friend ostream &operator<< (ostream &os, Node* x);
private:
Node *l, *r, *p;
K _key;
V _val;
};
T
typename bst::Node* bst::root() { return _root; } // why typename?
T
ostream &operator<<(ostream &os, typename bst::Node& x) {
os << x.key();
return os;
} // runs into an error
【问题讨论】:
-
1. 如果 BST 没有被模板化,我本来可以只使用 BST::Node 对吗? 对 2. 交友是通过另一种方式完成的,请参阅 stackoverflow.com/a/4014424/3365922
-
1.有关说明,请参阅 this。
标签: c++ templates operator-overloading typename