c++ - 具有模板参数的模板类上的赋值运算符重载

标签 c++ class templates

我正在设计自己的迭代器类,以便可以为我的容器创建自定义迭代器。我认为这是最简单的方法,而不是从 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的第一个模板参数是模板模板参数。也就是说,它应该以模板作为参数。你不能给 Cont<T>因为那是模板的特定实例。尝试:

iterator<Cont, T>

值得注意的是 Datatemplate<class Data> class Cont是多余的。就template<class> class Cont会做的很好。

考虑从 std::iterator 继承- 这就是它的设计目的。

关于c++ - 具有模板参数的模板类上的赋值运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15040099/

相关文章:

c++ - 面对cpp中排序功能的问题

C++ 类文件链接

c++ - 如何在初始化时仅针对特定对象继承和更改类?

php - XXX 不是有效的实体或映射的父类(super class)//和配置选项

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

C++ 模板的模板编译失败

c++ - 为什么 std::max 不适用于字符串文字?

c++ - 从多个进程和同一进程内注册相同的 ETW TraceLogging Provider GUID

c++ - 如何更改 DLL 中的过程名称

c++ - 通过示例了解变量模板