"A uses B, which is being defined"是什么意思?



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

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

以下代码。。。

    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;  

相关内容

最新更新