簡體   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