Я разрабатываю свой собственный класс итератора, чтобы создавать пользовательские итераторы для своих контейнеров. Я полагал, что это был самый простой подход, а не наследование от bidirectional_iterator или iterator_traits. Проблема в том, что контейнеры также шаблоны. При написании моих конструкторов копирования и операторов присваивания для данного класса, компилятор не нравится тип возвращаемого значения, ни параметр (который являетсяПерегрузка оператора присваивания в классе шаблона с параметрами шаблона
iterator<someContainer<someClasstype>>.
Является ли это проблема, которая может быть исправлена? Или это ограничение, как глубокие шаблоны могут идти
Вот класс:
template <template<class Data> class Cont, class T>
class iterator
{
typedef typename Cont<T> container_type;
typedef T* ptr_type;
typedef T value_type;
private:
ptr_type _ptr;
size_t _alloc; // offset to apply when jumping contiguos addresses
public:
// ctors
// Default
explicit iterator()
{
_ptr = 0;
_alloc = sizeof(value_type);
}
// reference
explicit iterator(const value_type& address): _ptr(address)
{
_alloc = sizeof(value_type);
}
// pointer
explicit iterator(const ptr_type ptr): _ptr(ptr)
{
_alloc = sizeof(value_type);
}
// copy
iterator(const iterator<Cont<T>, T>& right)
{
_ptr = right._ptr;
_alloc = right._alloc;
}
// operators
// assignment
iterator<Cont<T>, T>& operator=(const value_type& address)
{
return *this(address);
}
iterator<Cont<T>, T>& operator=(const ptr_type ptr)
{
return *this(ptr);
}
iterator<Cont<T>, T>& operator=(const iterator<container_type, T>& right)
{
return *this(right);
}
// equality
bool operator==(const iterator<container_type, T>& right)
{
return (_ptr == right._ptr && _alloc == right._alloc);
}
// dereference
T& operator*(const iterator<container_type, T>& it)
{
return *_ptr;
}
T* operator() // get value operator? (ie list<int>::iterator returns the memory address, even though its a class
{
return _ptr;
}
};
Я до сих пор пытались эти комбинации:
iterator<Cont<T>>
iterator<Cont<T>, T>
iterator<container_type> // typedef of Cont<T>
iterator<container_type, T>
, но ни один из них не принимается. Ошибки компилятора являются:
Error 1 error C3200: 'Cont<T>' : invalid template argument for template parameter 'Cont', expected a class template c:\users\sapphire\documents\visual studio 2012\projects\hybridlist\hybridlist\iterator.h 43
Error 2 error C2976: 'iterator' : too few template arguments c:\users\sapphire\documents\visual studio 2012\projects\hybridlist\hybridlist\iterator.h 53
Ну, сообщение об ошибке довольно ясно. Он должен быть 'итератором', а не 'iterator , T>'. Вы перехитрили себя с шаблонами шаблонов шаблонов с шаблонами. Это происходит ... –
Строка 4 вам не нужна 'typename': http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and -typename-ключевые слова. В '' '' '' '' 'отсутствует второй'() 'тоже. – Flexo
Кстати, аргументы шаблона шаблона, как правило, не так полезны, потому что они очень ограничительные. Обычным подходом является шаблон на полном * типе * и использование признаков для извлечения параметрической информации. –