迭代器运算符++重载编译错误
iterator operator++ overload compiling error
我有一个链表,其中包含指向第一个和最后一个节点的指针以及指示列表中有多少节点的大小。
我已经为指向节点地址的队列实现了迭代器,我已经成功地实现了 begin()、end() 和 ==、!=,并且也进行了测试,
但是我无法为迭代器实现 ++() 和 ++(int) 运算符,我希望 ++ 运算符将节点的地址更改为链表中的下一个节点,当出现以下错误时我尝试编译:no matching function for call to ‘Node<int>::getNext() const’
以及如何在声明开始时不输入 typename
的情况下使迭代器运算符重载工作
Node
class:
template<class T>
class Node {
public:
Node(const T& t);
~Node()=default; // Destructor
Node(const Node&) = default; // Copy Constructor set to default
Node& operator=(const Node&) = default; // Assignment operator set to default
T& getData();
const T& getData() const;
Node* getNext();
void setNext(Node<T>* newNext);
private:
T m_data;
Node* m_nextNode;
};
template<class T>
Node<T>::Node(const T& t) {
this->m_data=t;
this->m_nextNode=nullptr;
}
template<class T>
Node<T>* Node<T>::getNext() {
return this->m_nextNode;
}
Queue
class:
template<class T>
class Queue {
public:
static const int DEFAULT_FIRST_INDEX=0;
static const int SIZE_EMPTY=0;
Queue();
~Queue(); // Destructor
Queue(const Queue&) = default; // Copy Constructor set to default
Queue& operator=(const Queue&) = default; // Assignment operator set to default
void pushBack(const T& t);
T& front();
const T& front() const;
void popFront();
int size() const;
class Iterator;
Iterator begin() const;
Iterator end() const;
class EmptyQueue {};
private:
Node<T>* m_head;
Node<T>* m_tail;
int m_size;
};
Queue<T>::Iterator
class:
template<class T>
class Queue<T>::Iterator {
public:
const T& operator*() const;
Iterator& operator++();
Iterator operator++(int);
bool operator==(const Iterator& iterator) const;
bool operator!=(const Iterator& iterator) const;
Iterator(const Iterator&)=default;
Iterator& operator=(const Iterator&)=default;
class InvalidOperation {};
private:
const Node<T>* m_node;
Iterator(const Node<T>* m_node);
friend class Queue<T>;
};
template<class T>
Queue<T>::Iterator::Iterator(const Node<T>* m_node) {
this->m_node=m_node;
}
template<class T>
typename Queue<T>::Iterator& Queue<T>::Iterator::operator++() {
this->m_node=m_node->getNext();
return *this;
}
How do I make it work without typename
at the start of the definition?
如果你指的是函数 Queue<T>::Iterator::operator++()
的定义,你可以通过 trailing return type 来实现,如下所示:
template<class T>
auto Queue<T>::Iterator::operator++() -> Iterator&
//^^^ ^^^^^^^^^
{
this->m_node = m_node->getNext();
return *this;
}
也就是说,(IMO) 将模板 类 或模板函数的定义移到同一转换单元之外有点冗长乏味。
我有一个链表,其中包含指向第一个和最后一个节点的指针以及指示列表中有多少节点的大小。
我已经为指向节点地址的队列实现了迭代器,我已经成功地实现了 begin()、end() 和 ==、!=,并且也进行了测试,
但是我无法为迭代器实现 ++() 和 ++(int) 运算符,我希望 ++ 运算符将节点的地址更改为链表中的下一个节点,当出现以下错误时我尝试编译:no matching function for call to ‘Node<int>::getNext() const’
以及如何在声明开始时不输入 typename
的情况下使迭代器运算符重载工作
Node
class:
template<class T>
class Node {
public:
Node(const T& t);
~Node()=default; // Destructor
Node(const Node&) = default; // Copy Constructor set to default
Node& operator=(const Node&) = default; // Assignment operator set to default
T& getData();
const T& getData() const;
Node* getNext();
void setNext(Node<T>* newNext);
private:
T m_data;
Node* m_nextNode;
};
template<class T>
Node<T>::Node(const T& t) {
this->m_data=t;
this->m_nextNode=nullptr;
}
template<class T>
Node<T>* Node<T>::getNext() {
return this->m_nextNode;
}
Queue
class:
template<class T>
class Queue {
public:
static const int DEFAULT_FIRST_INDEX=0;
static const int SIZE_EMPTY=0;
Queue();
~Queue(); // Destructor
Queue(const Queue&) = default; // Copy Constructor set to default
Queue& operator=(const Queue&) = default; // Assignment operator set to default
void pushBack(const T& t);
T& front();
const T& front() const;
void popFront();
int size() const;
class Iterator;
Iterator begin() const;
Iterator end() const;
class EmptyQueue {};
private:
Node<T>* m_head;
Node<T>* m_tail;
int m_size;
};
Queue<T>::Iterator
class:
template<class T>
class Queue<T>::Iterator {
public:
const T& operator*() const;
Iterator& operator++();
Iterator operator++(int);
bool operator==(const Iterator& iterator) const;
bool operator!=(const Iterator& iterator) const;
Iterator(const Iterator&)=default;
Iterator& operator=(const Iterator&)=default;
class InvalidOperation {};
private:
const Node<T>* m_node;
Iterator(const Node<T>* m_node);
friend class Queue<T>;
};
template<class T>
Queue<T>::Iterator::Iterator(const Node<T>* m_node) {
this->m_node=m_node;
}
template<class T>
typename Queue<T>::Iterator& Queue<T>::Iterator::operator++() {
this->m_node=m_node->getNext();
return *this;
}
How do I make it work without
typename
at the start of the definition?
如果你指的是函数 Queue<T>::Iterator::operator++()
的定义,你可以通过 trailing return type 来实现,如下所示:
template<class T>
auto Queue<T>::Iterator::operator++() -> Iterator&
//^^^ ^^^^^^^^^
{
this->m_node = m_node->getNext();
return *this;
}
也就是说,(IMO) 将模板 类 或模板函数的定义移到同一转换单元之外有点冗长乏味。