Инициализация статического члена внешнего шаблона - PullRequest
0 голосов
/ 21 января 2012

У меня есть следующее:

// 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 (сторожевой узел).

Ответы [ 2 ]

1 голос
/ 21 января 2012

Судя по всему, вам не хватает * в объявлении статического члена: вы определяете TreeMapNode*, но вы объявили TreeMapNode.

При этом обратите внимание, что этовероятно, не совсем то, что вам нужно: 1. если вы оставите определение статического члена в заголовке, вы получите несколько определенных символов, если вы когда-либо будете использовать TreeMap с одинаковыми аргументами шаблона в разных единицах перевода 2.если вы перемещаете определение в файл без заголовка, вам нужно добавить явные экземпляры статического члена для каждой комбинации аргументов шаблона

В целом, ограниченное использование объектов в качестве static членов классашаблон.Однако вы можете создать static функцию-член, которая вместо этого возвращает объект, например,

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

Существует много вариантов, например, для возврата ссылки или константной ссылки, и вы можете определить функцию внеопределение и т. д. Объект static в приведенном выше коде действительно нужен, только если вы хотите вернуть ссылку на него.В противном случае вы можете просто вернуть 0.

1 голос
/ 21 января 2012

Этот фрагмент:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...