2012-01-20 131 views
0

我有以下几点:模板化的外部类的静态成员初始化

// 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中::零部件的语法。我最终希望TreeMap :: nil成员是一个空的TreeMap :: TreeMapNode(sentinel节点)。

+0

您是否尝试将您的成员声明为“TreeMapNode *”而不是“TreeMapNode”(而不是缺少'*')? –

回答

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

从它的外观,而是缺乏在静态成员的声明中*:您定义的TreeMapNode*但你申报了TreeMapNode

不过,请注意,这可能并不十分给你想你想: 1.如果你留在头中的静态成员的定义,你会如果你使用TreeMap与得到多重定义的符号不同翻译单元中的相同模板参数 2.如果将定义移动到非头文件,则需要为每个模板参数组合添加静态成员的显式实例化

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

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

它有许多变化,例如,返回一个引用或者一个const引用,你可能想定义定义之外的函数等等。上面代码中的static对象实际上只在需要返回引用时才需要。否则,您可以直接返回0