前向声明子类模板



首先,感谢所有能帮助我的人。我目前正在研究XML解析器。这是我不久前所拥有的:

class Root
{
    // bla bla
}

根是链表的第一项。它有一个指向第一个元素的指针,以及从列表中添加和删除元素的函数。

class Base
{
    // bla bla
}

基类是一个简单的Item,带有一个指向下一个Item的指针。

class Child : public Base
{
    // bla bla
};

子类是从基类派生出来的,并且包含数据(例如我的XML文件的元素和属性的名称和值)。

class Derived_1 : public Child
{
    // bla bla
};
class Derived_2 : public Child
{
    // bla bla
};

派生类是我的属性和元素。Elements包含一个属性列表的Root,和一个元素列表的Root(这样我就可以构建一个层次结构)。

我的基类需要包含根的函数,但不能作为子类继承它们。所以我们在基类中将根函数"加为好友"。

class Base
{
    friend class Root
    // bla bla
}

最近,我们谈到了模板,并且必须将它们集成到XML解析器中。因此,首先,我们在模板中转换根类。因此,根被用于两个派生类,基类受到如下影响:

template< class T >
class Root
{
    // bla bla
}
-------------
class Derived_1;
class Derived_2;
class Child;
class Base
{
    friend class Root<Derived_1>
    friend class Root<Derived_2>
    friend class Root<Child>
    // bla bla
}
-------------
class Child : public Base
{
    // bla bla
};

到现在为止,没有问题。我们必须向前声明派生类,以避免include中的循环。然后,我们必须使基类成为模板,所以我们有:

class Derived_1;
class Derived_2;
class Child;
template< class T >
class Base
{
    friend class Root<Derived_1>
    friend class Root<Derived_2>
    friend class Root<Child>
    // bla bla
}
-------------
class Child : public Base<Child>
{
    // bla bla
};

然后,问题出现了,我们让Child类成为一个模板,所以它变成了:

template< class T >
class Child : public Base<T>
{
    // bla bla
};

然而,基类中的前向声明不再好了,我们声明友类的方式也是如此。我必须找到一种方法来向前声明Child类,但我不知道该怎么做。直到现在,我还没有遇到任何困难,但在这里,我看不出它背后的逻辑。有人能向我解释一下这里的工作方式吗(我不要求答案,我只需要复制/过去你告诉我的,但我想了解发生了什么。)非常感谢您的帮助。

您的困难似乎源于类和类模板之间的差异。特别地,为了添加从类模板实例化的前向声明类型,您需要前向声明类模板:

template <class T> class Child;

那么你可以加它为好友:

template <class T> class Base
{
    friend class Child<T>; // or
    friend class Root< Child<T> >;
    : : :
};

但请注意,友谊是最紧密的耦合形式,当有更好的手段达到你的目的时,应该避免。

最新更新