繁体   English   中英

转发声明子类模板

[英]Forward declare child class template

首先,感谢任何可以帮助我的人。 我目前正在研究XML解析器。 这是我不久前的事情:

class Root
{
    // bla bla
}

Root是链表的第一项。 它有一个指向第一个项目的指针,以及从列表中添加和删除项目的功能。

class Base
{
    // bla bla
}

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

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

Child类派生自Base类,并包含数据(例如,包含元素的名称和值以及XML文件的属性)。

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

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

派生类是我的属性和我的元素。 元素包含Root用于属性列表,另一个用于元素列表(因此我可以构建层次结构)。

我的基类需要包含Root的函数,但不能将它们作为子函数继承。 所以我们在Base类中“朋友”了Root函数。

class Base
{
    friend class Root
    // bla bla
}

最近,我们讨论了模板,并且必须将它们集成到XML解析器中。 所以,首先,我们在模板中转换了Root类。 因此,Root用于两个Derived类,Base类以这种方式受到影响:

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
};

到现在为止,没问题。 我们必须转发声明Derived类以避免包含中的循环。 然后,我们必须使Base类成为模板,所以我们有:

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
};

但是,Base类中的前向声明不再好了,我们也没有声明好友类的方式。 我必须找到一种方法来转发声明Child类,但我看不出如何。 到目前为止,我没有遇到任何困难,但在这里,我没有看到它背后的逻辑。 有人可以向我解释一下这里的工作方式(我不要求答案,我只需要复制/过去你告诉我的内容,但我想了解发生了什么。非常感谢任何帮助。

您的困难似乎源于类和类模板之间的差异。 特别是,为了成为从类模板实例化的前向声明类型的朋友,您需要转发声明类模板:

template <class T> class Child;

然后你就可以了解它:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM