使用模板类我正在尝试基于链表实现自定义容器的迭代器类。我正在尝试迭代链表中的节点。
我的主要代码是:
#include "Smaph.h"
#include <iostream>
#include <string>
using namespace std;
int main() {
Smaph<string, int> x1;
x1.insert("john", 3);
x1.insert("alex", 5);
cout << "Size is " << x1.size() << endl;
Smaph<string, int>::iterator it;
for (it=x1.begin(); it!=x1.end(); ++it)
cout << *it << endl;
}
执行for循环语句时会发生错误,调用x1.begin()
错误在于转换头指针:
could not convert
((const Smaph<std:basic_string<char>, int>*)this)->
Smaph<std::basic_string<char>, int>::head
from
Smaph<std::basic_string<char>, int>::node* const
to
Smaph<std::basic_string<char>, int>::iterator
aka sl_iterator<std::basic_string<char>, int>
以下是我的单个Smaph.h文件
template <typename T1, typename T2> class sl_iterator;
template <typename T1, typename T2>
class Smaph
{
public:
typedef T1 key_type;
typedef T2 mapped_type;
typedef unsigned int size_type;
typedef sl_iterator<T1, T2> iterator;
friend class sl_iterator<T1, T2>;
struct node {
T1 datum1;
T2 datum2;
struct node *next;
};
node *head, *tail;
Smaph() : head(0), tail(0) { }
~Smaph() { clear(); }
bool insert(const key_type &first, const mapped_type &second) {
node *p = new node;
p->datum1 = first;
p->datum2 = second;
p->next = 0;
if (!tail) // empty list?
head = p;
else
tail->next = p;
tail = p;
return (1); // return true for now
}
size_type size() const {
int count=0;
for (node *p = head; p; p=p->next)
count++;
return count;
}
void clear() {
while (head) {
node *p = head->next;
delete head;
head = p;
}
}
bool empty() const {
return !head;
}
iterator begin() const {
return head;
}
iterator end() const {
return 0;
}
};
template <typename T1, typename T2>
class sl_iterator {
public:
typedef T1 key_type;
typedef T2 mapped_type;
typedef unsigned int size_type;
struct node {
T1 datum1;
T2 datum2;
struct node *next;
};
//private:
node *p;
// This private ctor is for the container class only:
sl_iterator(node *ptr) : p(ptr) { }
public:
sl_iterator() : p(0) { }
sl_iterator &operator++() { // Preincrement
p = p->next;
return *this;
}
sl_iterator operator++(int) { // Postincrement
const sl_iterator tmp = *this;
++*this;
return tmp;
}
// *sl_iterator: Return a reference to the datum
T1 &operator*() const {
return p->datum1;
}
// sl_iterator->: Return the address of the datum
T1 *operator->() const {
return &p->datum1;
}
bool operator==(const sl_iterator &rhs) const {
return p==rhs.p;
}
bool operator!=(const sl_iterator &rhs) const {
return !(*this == rhs);
}
}; // end class
答案 0 :(得分:1)
您似乎希望编译器将嵌套类sl_iterator<T1, T2>::node
和Smaph<T1, T2>::node
视为同一个类。即使他们的定义相同,但事实并非如此。
您可能希望更改sl_iterator
的定义,使其不包含node
的进一步定义,而是引用Smaph::node
:
template <typename T1, typename T2>
class sl_iterator {
// ...
typename Smaph<T1, T2>::node *p;
sl_iterator(typename Smaph<T1, T2>::node *ptr) : p(ptr) { }
// ...
};