2013-04-28 84 views
1

使用模板類我試圖爲基於鏈表的自定義容器實現迭代器類。我試圖迭代我的​​鏈表中的節點。C++模板類迭代器錯誤

我的主要代碼:

#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; 
} 

時執行的循環語句,與調用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 

回答

1

看來你希望編譯器將嵌套類sl_iterator<T1, T2>::nodeSmaph<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) { } 

// ... 
}; 
+0

謝謝。您的回覆使我能夠正常工作。 – 2013-04-29 02:01:46

+0

@Alex_B:不客氣,祝你的項目順利 – 2013-04-29 07:27:52