Ошибка для typedef в заголовочном файле с использованием класса std :: pair

Я пишу реализацию SkipList в стиле STD: с использованием распределителей, итераторов и т. Д. Весь класс готов и работает, но сейчас я пытаюсь написать заголовочный файл для созданного мною класса. Мой текущий контент заголовочного файла:

template<class _MySkiplist>
class _Skiplist_const_iterator;

template<class _MySkiplist>
class _Skiplist_iterator;

template<class _Kty,
class _Pr,
class _Alloc>
class skiplist
{
typedef skiplist<_Kty, _Pr, _Alloc> _Myt;

typedef typename _Skiplist_const_iterator<_Myt> const_iterator;
typedef typename _Skiplist_iterator<_Myt> iterator;

typedef typename _Alloc::size_type size_type;

typedef std::pair<iterator, iterator> _Pairii;
typedef std::pair<iterator, bool> _Pairib;

skiplist();
skiplist(const _Alloc& _Al);
skiplist(const _Pr& _Pred);
skiplist(const _Pr& _Pred, const _Alloc& _Al);
~skiplist();

iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;

size_type size() const;
size_type max_size() const;
bool empty() const;

//  _Pairib insert(_Kty& _val);
//  _Pairib  insert(const _Kty& _val);
size_type erase(const _Kty& x);
void clear();

_Pr key_comp() const;
_Pr value_comp() const;

iterator find(const _Kty& x);
size_type count(const _Kty& x) const;
iterator lower_bound(const _Kty& x) const;
iterator upper_bound(const _Kty& x) const;
//      _Pairii equal_range(const _Kty& x) const;

_Alloc get_allocator() const;
};

Я продолжаю получать следующие ошибки:

Ошибка 1 ошибка C2143: синтаксическая ошибка: отсутствует ‘;’ до ‘<‘

Ошибка 3 ошибка C2238: неожиданный токен (ы) перед ‘;’

Ошибка 5 ошибка C2238: неожиданный токен (ы), предшествующий ‘;’

Ошибка 2 ошибка C4430: отсутствует указатель типа — предполагается int. Примечание: C ++
не поддерживает default-int

Все эти ошибки относятся к следующим двум строкам в заголовочном файле:

        typedef std::pair<iterator, iterator> _Pairii;
typedef std::pair<iterator, bool> _Pairib;

У меня заканчиваются идеи, почему ошибки происходят.

1

Решение

Ошибка, которая вызывает это, заключается в том, что вы используете typename на независимые имена типов:

typedef typename _Skiplist_const_iterator<_Myt> const_iterator;
typedef typename _Skiplist_iterator<_Myt> iterator;

Удаление typename и включая заголовок <memory> где std::pair определяется, делает свое дело.

Обратите внимание, что ваши идентификаторы недействительны (идентификаторы, начинающиеся с символа подчеркивания, за которым следует либо другое подчеркивание, либо заглавная буква, зарезервированы), и что вы являются разрешено использовать удобочитаемый идентификаторы. 😉 Стандартные реализации библиотеки используют зарезервированные идентификаторы, чтобы избежать конфликтов с клиентским кодом. Но ты не должен этого делать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]