«T» не является допустимым аргументом шаблона для параметра «Derived» - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь объявить класс итератора в классе массива, а затем реализовать его вне класса массива. Тем не менее, я столкнулся с синтаксической ошибкой. Я не уверен, почему это не работает. Я только смог сделать вывод, что проблема связана с моей попыткой реализовать итератор массива. Я обозначил строку данной ошибки ниже. Спросите, нужен ли вам какой-либо другой код или какое-то объяснение, я удалил много кода, чтобы не публиковать сообщения.

РЕДАКТИРОВАТЬ: я заменил неправильный заголовок на правильный заголовок. Я получил разные ошибки, которые я исправил, поместив ключевое слово typename. Можно ли кому-то объяснить, почему ключевое слово typename было моей реализацией классов итераторов? Ошибка, которую я получил без нее, была

std_bidirectional_iterator: ds :: Array :: iterator не является допустимым аргументом шаблона для производного параметра.

Array.h

#include "Common.h"
#include "ArrayInterface.h"
#include "std_bidirectional_iterator.h"

template<class T, size_t N>
class ds::ArrayTwo : public ArrayInterface<T>
{
    class iterator; // Tried with all following implementations
    template<class T> class reverse_iterator;

    template<class U> class const_iterator;
    template<class T> class const_reverse_iterator;
};

template<class T, size_t N>
// Error on line below[fixed by typename]
class ds::ArrayTwo<T, N>::iterator : public std_bidirectional_iterator<typename ds::ArrayTwo<T, N>::iterator, T>
{
};

std_bidirectional_iterator.h

#include <iterator>

template<class Derived, class Type>
class std_bidirectional_iterator : public std::iterator<std::bidirectional_iterator_tag, Type>
{
    virtual Derived & operator=(const Derived & it) = 0;            // Copy Assignment Operator

    virtual reference operator*(void) = 0;                          // De-Reference Operator (Returns reference)

    virtual pointer operator->(void) = 0;                           // De-Reference Operator (Returns pointer)

    virtual Derived & operator++(void) = 0;                         // Pre-Fix ++
    virtual Derived operator++(int) = 0;                            // Post-Fix ++

    virtual Derived & operator--(void) = 0;                         // Pre-Fix --
    virtual Derived operator--(int) = 0;                            // Post-Fix --

    virtual bool operator==(const Derived & it) const = 0;          // Equal To Operator
    virtual bool operator!=(const Derived & it) const = 0;          // Not Equal To Operator
};
...