现在我按照规则要求做了,并且首先看看是否已经回答了这个问题,虽然我确实找到了一个帖子,但它没有解决我的具体问题,因此我自己提出。
对于一个简短的上下文,这个错误在我正在制作的双链表列表的节点类中,因此显然节点必须对其进程和前面的邻居有某种了解
以下代码......
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:
};
......第12行不会停止给我以下错误
Error C2460
'dslListNode<T>::m_prev': uses 'dslListNode<T>', which is being defined
所以你...
我真的对目前正在发生的事情感到茫然,我在c ++的技能并没有达到我理解为什么会发生这种事情的程度,到目前为止互联网在这方面没有帮助因此我请求帮助。
为什么会发生这种情况,我该怎么做才能解决它?
为我的语法和拼写道歉btw = D
感谢先进=)
答案 0 :(得分:5)
该行:
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;
但是,两行版本更具可读性。我强烈建议使用它。
答案 1 :(得分:4)
在这种情况下,它意味着您将*
从m_prev
的声明中删除。该成员将是dslListNode
的实例,而不是指向一个的实例。
dslListNode<T>* m_next, *m_prev;
答案 2 :(得分:1)
在定义类时,您无法创建同一个类的成员变量,但您可以创建指向同一个类的指针。 正如你的代码所说,
dslListNode<T>* m_next, m_prev;
这意味着m_next是dslListNode的指针变量,m_prev只是变量。如果您更喜欢将m_prev声明为指针变量,则必须按如下方式使用指针语法:
dslListNode<T>* m_next, *m_prev;