模板类中的静态类变量被视为模板

时间:2014-12-15 17:28:57

标签: c++ templates static-members null sentinel

我有一个静态变量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引入了任何额外的间接方式)。

0 个答案:

没有答案