[英]assignment operator overload on a template class with template parameters
我正在設計自己的迭代器類,以便我可以為容器創建自定義迭代器。 我認為這是最簡單的方法,而不是繼承自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>
這是值得注意的, Data
在template<class Data> class Cont
是多余的。 只需要template<class> class Cont
就可以了。
考慮繼承自std::iterator
- 這就是它的設計目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.