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
4

1 に答える 1

4

iteratorの最初のテンプレート パラメータは、テンプレート テンプレート パラメータです。つまり、引数としてテンプレートを取る必要があります。Cont<T>それはテンプレートの特定のインスタンス化であるため、与えることはできません。試す:

iterator<Cont, T>

Dataintemplate<class Data> class Contは冗長であることに注意してください。template<class> class Contうまくいくだけです。

から継承することを検討してくださいstd::iterator- これは、それが設計されているものです。

于 2013-02-23T11:40:56.533 に答える