转发声明子类模板

时间:2014-05-16 21:01:05

标签: c++ xml templates forward-declaration

首先,感谢任何能帮助我的人。我目前正在研究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
};

Derived类是我的属性和我的元素。元素包含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类,但我不知道如何。到现在为止,我没有遇到任何困难,但在这里,我没有看到它背后的逻辑。有人可以向我解释一下这里的工作方式(我没有要求答案,我只需复制/过去你告诉我的内容,但我想了解发生了什么。非常感谢帮助

1 个答案:

答案 0 :(得分:2)

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

template <class T> class Child;

然后你可以与它交朋友:

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

但请注意,友谊是coupling中最严格的形式,如果有更好的方法可以达到目的,就应该避免。