“A使用B,正在定义”是什么意思?

时间:2015-12-29 02:54:29

标签: c++ visual-studio visual-c++ visual-studio-2015

现在我按照规则要求做了,并且首先看看是否已经回答了这个问题,虽然我确实找到了一个帖子,但它没有解决我的具体问题,因此我自己提出。

对于一个简短的上下文,这个错误在我正在制作的双链表列表的节点类中,因此显然节点必须对其进程和前面的邻居有某种了解

以下代码......

    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

感谢先进=)

3 个答案:

答案 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;