我是C ++模板的新手,我正在开发一个项目,我需要使用模板实现双向链接列表。但是,我似乎无法访问下一个和之前的节点元素。
例如,在我的析构函数中,我不能使用curr->提出我使用next或prev的选项。 IntelliSense只是说,“没有会员可用。”此外,我只能在构建时发现错误...没有红线,警告,任何事先出现。我很好奇为什么这不起作用......这是一个错误还是打算?如果是,到目前为止我的模板在哪里不正确?
template<class ItemType>
class SortedList
{
public:
SortedList();
~SortedList();
bool Insert (ItemType toAdd);
bool Delete (ItemType toDelete);
void Print();
private:
SortedList ( const SortedList & copyFrom );
SortedList & operator= ( const SortedList & assignFrom );
struct Node
{
Node ( ItemType item, Node * p = NULL, Node * n = NULL )
{ data = item; prev = p; next = n; }
ItemType data;
Node * prev, * next;
};
Node * list;
};
template<class ItemType>
SortedList<ItemType>::SortedList()
{
list = NULL;
}
template<class ItemType>
SortedList<ItemType>::~SortedList()
{
Node * curr = list;
while ( curr != NULL )
{
Node * tempNext = curr->next;
delete curr;
curr = tempNext;
}
}
答案 0 :(得分:0)
将Node
结构放在SortedList
之外,如下所示:
template<typename ItemType>
struct Node
{
Node(ItemType item, Node * p = NULL, Node * n = NULL)
{
data = item; prev = p; next = n;
}
ItemType data;
Node * prev, *next;
};
然后在SortedList
内实例化模板(创建类型),如下所示:
template<class ItemType>
class SortedList
{
public:
//... More code here.
private:
// ... More code here.
Node<ItemType> * list;
};
template<class ItemType>
SortedList<ItemType>::SortedList()
{
list = NULL;
}
template<class ItemType>
SortedList<ItemType>::~SortedList()
{
Node<ItemType> *curr = list;
while (curr != NULL)
{
Node * tempNext = curr->next; // Now this will work.
delete curr;
curr = tempNext;
}
}
模板,不是类型。您将获得实例化模板的类型。因此,类型Node
在您实例化模板StortedList
之前不存在,因为前者位于后者内部。
Node
的确切类型也是SortedList<ItemType>::Node
,在编译代码之前,您可以看到无法谈论Node
。这就是为什么IntelliSense不“看到它”。