我有一个静态变量nil
,它充当template <typename Node> Tree
的标记。我augmenting my trees专注于Node
类型,我是{{3}}。但是,我在构建nils时遇到了麻烦。
Nil作为Tree的静态成员
内部tree.h
template <typename Node>
class Tree {
using NP = Node*;
using T = typename Node::key_type;
NP root {nil};
// nil sentinel
static NP nil;
// core utilities
const static NP get_nil() {
return nil;
}
};
enum class Color : char {BLACK = 0, RED = 1};
template <typename T>
struct Basic_node {
using key_type = T;
T key;
Basic_node *parent, *left, *right;
Color color;
Basic_node() : color{Color::BLACK} {} // sentinel construction
Basic_node(T val, Color col = Color::RED) :
key{val},
parent{Tree<Basic_node>::get_nil()},
left{Tree<Basic_node>::get_nil()},
right{Tree<Basic_node>::get_nil()},
color{col} {}
};
template <typename T>
using Basic_tree = Tree<Basic_node<T>>;
template <typename T>
typename Basic_tree<T>::NP Basic_tree<T>::nil {new Basic_node<T>};
// alternatively
template <typename T>
Basic_node<T>* Basic_tree<T>::nil {new Basic_node{}};
错误
template definition of non-template 'typename sal::Basic_tree<T>::NP sal::Tree<sal::Basic_node<T> >::nil'
发生在最后两行。
我希望每个T类型使用Basic_node
对所有树使用相同的nil。
Nil作为Node的静态成员
然后我尝试将nil设为Basic_node
的静态成员。这样节点不依赖于树(parent{Tree<Basic_node>::get_nil()}
真的很讨厌)并且更自然。
template <typename T>
struct Basic_node {
static Basic_node* nil;
using key_type = T;
T key;
Basic_node *parent, *left, *right;
Color color;
Basic_node() : color{Color::BLACK} {} // sentinel construction
Basic_node(T val, Color col = Color::RED) : key{val}, parent{nil}, left{nil}, right{nil}, color{col} {}
};
template <typename T>
Basic_node<T>* Basic_node<T>::nil {new Basic_node{}};
// inside Tree
using Node::nil;
新错误是type 'sal::Basic_node<int>' is not a base type for type 'sal::Tree<sal::Basic_node<int> >'
,这意味着我正在滥用using
,因为它假定我指的是层次结构。我想在这里指的是当我在树的其余部分引用Node::nil
时使用nil
。
(请注意我的上一个方法有效,这只是我每次都要引用Node :: nil;而且,我很好奇Node :: nil引入了任何额外的间接方式)。