现在我按照规则要求做了,首先看看这个问题是否已经得到了回答,虽然我确实找到了一个帖子,但它没有解决我的具体问题,所以我自己问了。
对于一个简短的上下文,这个错误是在我正在创建的双链表类的节点类中,因此显然节点必须对其前进和先前的邻居有某种了解
以下代码。。。
template<class T> class dslListNode
{
public:
dslListNode(T data, dslListNode<T>* next, dslListNode<T>* prev)
: m_data(data)
{
this->m_next = next;
this->m_prev = prev;
}
T m_data;
dslListNode<T>* m_next, m_prev; //<-- line twelve
void purge()
{
if (this->m_next != NULL)
{
this->m_next->purge();
delete this->m_next;
}
}
private:
};
第十二行不会停止给我以下错误
Error C2460
'dslListNode<T>::m_prev': uses 'dslListNode<T>', which is being defined
所以你。。。
老实说,我不知道现在发生了什么,我在c++方面的技能还没有达到我理解为什么会发生这样的事情的水平,互联网到目前为止在这方面没有帮助,所以我请求帮助。
为什么会发生这种情况,我能做些什么来解决它?
很抱歉我的语法和拼写btw=D
感谢高级=)
行:
dslListNode<T>* m_next, m_prev;
相当于:
dslListNode<T>* m_next; // A pointer
dslListNode<T> m_prev; // An object.
在类的定义中有一个指向dslListNode<T>
的指针是可以的。该语言允许指向不完整类型的指针。
但是,在定义类本身时,不能有dslListNode<T>
类型的成员变量。类似于:
struct A
{
A a;
};
这是行不通的,因为A
的定义需要A
的定义。这导致了无限的下降。
你需要
dslListNode<T>* m_next; // A pointer
dslListNode<T>* m_prev; // Another pointer.
你可以使用一句话:
dslListNode<T>* m_next, *m_prev;
然而,两行版本的可读性更强。我强烈建议使用它。
在这种情况下,这意味着您在m_prev
的声明中省略了*
。该成员将是dslListNode
的实例,而不是指向某个实例的指针。
dslListNode<T>* m_next, *m_prev;
在定义类时不能创建同一类的成员变量,但可以创建指向同一个类的指针。正如你的代码中所说,
dslListNode<T>* m_next, m_prev;
这意味着m_next是dslListNode的指针变量,m_prev是唯一的变量。如果您喜欢将m_prev声明为指针变量,则必须适当地使用指针语法,如下所示:
dslListNode<T>* m_next, *m_prev;