我希望以前在某些问题中没有涵盖过这个问题。我尽我所能,但我认为问题的一部分是我不明白是什么,这可能阻止我找到以前的答案。如果是的话,我道歉,否则......
对于使用模板练习并且通常更好地理解C ++和代码设计,我已经开始编写链接列表的(当前非常简单的)实现,主要是寻求模仿std :: list。我一直在努力正确地实现迭代器,其他组件在逻辑上,但我遇到了障碍。我猜它是在某处使用模板语法,但我不确定。这可能只是一些愚蠢的错误。
以下是该类的一般结构:
template <class T>
class LinkedList {
public:
LinkedList();
class Iterator;
void push_front(const T&);
void push_back(const T&);
void pop_front();
void pop_back();
T& front();
T& back();
unsigned int size() const;
bool empty() const;
Iterator begin();
Iterator end();
private:
struct ListNode;
ListNode* m_front;
ListNode* m_back;
unsigned int m_size;
};
template <class T>
class LinkedList<T>::Iterator {
public:
Iterator();
Iterator(const Iterator& rhs);
Iterator(ListNode* const& node);
Iterator operator=(const Iterator& rhs);
T& operator*();
bool operator==(const Iterator& rhs) const;
bool operator!=(const Iterator& rhs) const;
Iterator operator++();
private:
ListNode* m_node;
};
template <class T>
struct LinkedList<T>::ListNode {
T* m_data;
ListNode* m_next;
};
这是违规的功能:
template <class T>
void LinkedList<T>::push_front(const T&) {
if (m_front == NULL) {
m_front = new ListNode;
*(m_front->m_data) = T;
m_front->m_next = NULL;
m_back = m_front;
} else if (m_front == m_back) {
m_front = new ListNode;
*(m_front->m_data) = T;
m_front->m_next = m_back;
} else {
ListNode* former_front(m_front);
m_front = new ListNode;
*(m_front->m_data) = T;
m_front->m_next = former_front;
}
}
GCC 4.6.3给出的错误:
linkedlist.hpp: In member function ‘void pract::LinkedList<T>::push_front(const T&)’:
linkedlist.hpp:75:31: error: expected primary-expression before ‘;’ token
linkedlist.hpp:80:31: error: expected primary-expression before ‘;’ token
linkedlist.hpp:85:31: error: expected primary-expression before ‘;’ token
我希望所有这些都有所帮助,但如果还有其他任何可取之处,那就请问。 谢谢大家。
答案 0 :(得分:1)
问题出在以下几个方面:
*(m_front->m_data) = T;
这是试图为变量分配一个类型,这显然是不可能的。可能你想要一个命名参数并将这个参数用于这个赋值:
template <class T>
void LinkedList<T>::push_front(const T& t) {
if (m_front == NULL) {
m_front = new ListNode;
*(m_front->m_data) = t;
m_front->m_next = NULL;
m_back = m_front;
} else if (m_front == m_back) {
m_front = new ListNode;
*(m_front->m_data) = t;
m_front->m_next = m_back;
} else {
ListNode* former_front(m_front);
m_front = new ListNode;
*(m_front->m_data) = t;
m_front->m_next = former_front;
}
}