[英]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.