2013-02-23 2 views
1

Я разрабатываю свой собственный класс итератора, чтобы создавать пользовательские итераторы для своих контейнеров. Я полагал, что это был самый простой подход, а не наследование от 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 
+2

Ну, сообщение об ошибке довольно ясно. Он должен быть 'итератором ', а не 'iterator , T>'. Вы перехитрили себя с шаблонами шаблонов шаблонов с шаблонами. Это происходит ... –

+0

Строка 4 вам не нужна 'typename': http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and -typename-ключевые слова. В '' '' '' '' 'отсутствует второй'() 'тоже. – Flexo

+2

Кстати, аргументы шаблона шаблона, как правило, не так полезны, потому что они очень ограничительные. Обычным подходом является шаблон на полном * типе * и использование признаков для извлечения параметрической информации. –

ответ

4

iterator «s первым параметром шаблона является параметром шаблона шаблон. То есть, он должен принять шаблон в качестве аргумента. Вы не можете дать Cont<T>, потому что это конкретное создание шаблона. Попробуйте:

iterator<Cont, T> 

Стоит отметить, что в Datatemplate<class Data> class Cont является излишним. Просто template<class> class Cont подойдет.

Рассмотрите наследование от std::iterator - это то, для чего оно предназначено.

+0

Bahh, я не понимал, что параметр шаблона шаблона не нужно снова указывать с параметрами шаблона. Это решило проблему. – Igneous01

Смежные вопросы