0
我正在爲Queue數據類型實現迭代器,但由於某種原因,迭代器正在作爲類實現內部的常量初始化。我無法弄清楚爲什麼構造函數會導致迭代器以const形式返回自身。迭代器實現 - (鏈接列表隊列)
任何有關可能導致我的問題的C++語言錯綜複雜的反饋都會非常有幫助。
我從Eclipse的接收,這似乎是從我開始()方法來錯誤是:
../src/linked_queue.hpp:315:35: error: invalid conversion from
'const ics::LinkedQueue<int>*' to 'ics::LinkedQueue<int>*' [-fpermissive]
接口:
#ifndef LINKED_QUEUE_HPP_
#define LINKED_QUEUE_HPP_
#include <string>
#include <iostream>
#include <sstream>
#include <initializer_list>
#include "ics_exceptions.hpp"
namespace ics {
template<class T> class LinkedQueue {
public:
//Destructor/Constructors
~LinkedQueue();
LinkedQueue ();
LinkedQueue (const LinkedQueue<T>& to_copy);
explicit LinkedQueue (const std::initializer_list<T>& il);
template <class Iterable>
explicit LinkedQueue (const Iterable& i);
//Queries
bool empty () const;
int size () const;
T& peek () const;
std::string str() const; //supplies useful debugging information; contrast to operator <<
//Commands
int enqueue (const T& element);
T dequeue();
void clear ();
template <class Iterable>
int enqueue_all (const Iterable& i);
//Operators
LinkedQueue<T>& operator = (const LinkedQueue<T>& rhs);
bool operator == (const LinkedQueue<T>& rhs) const;
bool operator != (const LinkedQueue<T>& rhs) const;
template<class T2>
friend std::ostream& operator << (std::ostream& outs, const LinkedQueue<T2>& q);
private:
class LN;
public:
class Iterator {
public:
~Iterator();
T erase();
std::string str () const;
LinkedQueue<T>::Iterator& operator ++();
LinkedQueue<T>::Iterator operator ++ (int);
bool operator == (const LinkedQueue<T>::Iterator& rhs) const;
bool operator != (const LinkedQueue<T>::Iterator& rhs) const;
T& operator * () const;
T* operator ->() const;
friend std::ostream& operator << (std::ostream& outs, const LinkedQueue<T>::Iterator& i) {
outs << i.str();
return outs;
}
friend Iterator LinkedQueue<T>::begin() const;
friend Iterator LinkedQueue<T>::end () const;
private:
LN* prev = nullptr;
LN* current;
LinkedQueue<T>* ref_queue;
int expected_mod_count;
bool can_erase = true;
Iterator(LinkedQueue<T>* iterate_over, LN* initial);
};
Iterator begin() const;
Iterator end () const;
private:
class LN {
public:
LN() {}
LN (const LN& ln) : value(ln.value), next(ln.next){}
LN (T v, LN* n = nullptr) : value(v), next(n){}
T value;
LN* next = nullptr;
};
LN* front = nullptr;
LN* rear = nullptr;
int used = 0; //Cache for number of values in linked list
int mod_count = 0; //For sensing any concurrent modifications
//Helper methods
void delete_list(LN*& front);
};
實施(我只包括的部分我的迭代器代碼):
template<class T>
auto LinkedQueue<T>::begin() const -> LinkedQueue<T>::Iterator {
return Iterator(this, this->front);
}
template<class T>
auto LinkedQueue<T>::end() const -> LinkedQueue<T>::Iterator {
// return Iterator(this, this->rear);
}
template<class T>
LinkedQueue<T>::Iterator::Iterator(LinkedQueue<T>* iterate_over, LN* initial) {
ref_queue = iterate_over;
expected_mod_count = iterate_over->mod_count;
current = initial;
}
'Iterator begin()const;'被標記爲'const',因此函數中使用的'this'也是'const'。所以編譯器會提供一個錯誤,即它無法從常量轉換爲非常量。 – Niall
可以理解。但是我將這個作爲一個類來使用,並且我應該以這種方式實現函數,那麼是否有任何方法可以正確地實現Iterator/begin函數,以便我可以將引用傳遞給Iterator? – Cameron
你可以在構造函數簽名'Iterator(LinkedQueue const * iterate_over,LN * initial);'和成員const以及'LinkedQueue const * ref_queue;'' –
Niall