模板化外部类静态成员初始化

时间:2012-01-20 23:41:16

标签: c++ templates

我有以下内容:

// TreeMap.h

template<class K, class V>
class TreeMap {
public:
    enum Color {
        BLACK,
        RED
    }; 

    class TreeMapNode {
        K& key;
        V& value;
        Color c; 
    public:
        TreeMapNode(K&,V&);
        TreeMapNode(std::pair<K,V>);
        K& getKey(void); 
        V& getValue(void);
        Color getColor(void); 

        void setColor(Color); 
    };
private:
    TreeMapNode* root; 
    static TreeMapNode nil; 

// TreeMap.cpp

template<class K, class V>
TreeMap<K,V>::TreeMapNode* TreeMap<K,V>::nil (NULL);

我似乎无法正确获取初始化静态TreeMap :: nil成员的语法。我最终希望TreeMap :: nil成员是一个空的TreeMap :: TreeMapNode(sentinel节点)。

2 个答案:

答案 0 :(得分:1)

此片段:

template<class K, class V>
TreeMap<K,V>::TreeMapNode* TreeMap<K,V>::nil (NULL);

定义一个名为nil的指针,加上它使用一个依赖类型,你需要告诉编译器。你可能想要:

template<class K, class V>
typename TreeMap<K,V>::TreeMapNode TreeMap<K,V>::nil (NULL);

答案 1 :(得分:1)

从它的外观来看,你在静态成员的声明中缺少*:你定义了一个TreeMapNode*,但你声明了TreeMapNode

那说,请注意,这可能不会让你想要你想要的东西:  1.如果您在标题中保留静态成员的定义,如果您在不同的翻译单元中使用具有相同模板参数的TreeMap,您将获得多重定义的符号  2.如果将定义移动到非头文件,则需要为每个模板参数组合添加静态成员的显式实例化

通常,对象作为类模板的static成员使用有限。但是,您可以创建一个static成员函数来代替返回对象,例如

static TreeMapNode* nil() { static TreeMapnNode* rc(0); return rc; }

有许多变化,例如返回引用或const引用,你可能想要定义除定义之外的函数等。如果你想返回对它的引用,那么上面代码中的static对象才真正需要。否则,您只需返回0