我有以下内容:
// 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节点)。
答案 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
。