【问题标题】:Using template for nested class in C++在 C++ 中使用嵌套类的模板
【发布时间】:2020-04-08 06:53:22
【问题描述】:

在以下代码中,我有一个无法解决的疑问和错误:

  1. class BST之外定义函数root()时,为什么一定要使用typename bst::Node*?如果BST 没有被模板化,我就可以只使用BST::Node 对吗?

  2. 在类外为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


【解决方案1】:

是的,它叫做依赖名称查找。

如果C 是一个模板,那么在C&lt;T&gt;::N 构造中N 可以是一个类型名,也可以是该类的静态成员。如果不知道T 的类型,编译器就无法知道哪个。这是因为C 可以被特化,因此N 根据T 的类型具有不同的含义。

当编译器第一次看到template <typename K, typename V> typename BST<K,V>::Node* bst<K,V>::root() 时,它不知道KV 是什么类型,所以必须告诉它Node 是一种类型才能解析代码。这就是第三个typename 正在做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2011-05-04
    • 2017-02-05
    • 2020-09-25
    • 2015-07-29
    • 2020-12-16
    • 2018-04-22
    • 2019-02-25
    相关资源
    最近更新 更多