Инициализировать статический член std :: map внутри шаблонного класса? - PullRequest
2 голосов
/ 03 января 2012

Вот фрагмент кода из моего проекта:

template<typename Second, typename First = const UINT64>
class Event : virtual public id_manager<>
{
    friend class EventHandler;
    typedef std::map<First, EventHandler> eventMap;
    static eventMap mapper;
    static eventMap StartMapping()
    {
        eventMap temp;
        return temp;
    }
public:
    Event(){}
    void operator+=(EventHandler _handler)
    {
        mapper[this->getID()] = _handler;
    }
};
// INITIALIZATION FAILED HERE:
template<typename Second, typename First = const UINT64>
Event<Second, First>::eventMap Event<Second, First>::mapper(Event<Second, First>::StartMapping());

Вот ошибка вывода из Visual studio 2010:

Предупреждение 1, предупреждение C4346: 'Event :: eventMap': зависит имя не относится к типу c: \ users \ admin \ documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67 Ошибка 2, ошибка C2143: синтаксическая ошибка: отсутствует ';' до 'Event :: mapper' c: \ users \ admin \ documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67 Ошибка 3, ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int c: \ users \ admin \ Documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67 Ошибка 4, ошибка C1903: невозможно восстановить после предыдущей ошибки; остановка компиляция c: \ users \ admin \ documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67

Надеюсь, этого кусочка кода достаточно. Я не могу инициализировать член статической карты, используя "функцию инициализации" для этой карты. Большое спасибо!

1 Ответ

5 голосов
/ 03 января 2012

Вам нужно typename, чтобы сообщить компилятору, что eventMap является типом.

template<typename Second, typename First = const UINT64>
typename Event<Second, First>::eventMap Event<Second, First>::mapper(Event<Second, First>::StartMapping());

См. Ключевое слово "typename"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...