如何避免循环依赖导致错误 C2039?

How can I avoid circular dependency causing error C2039?

我仍在努力学习 C++,现在已经产生了循环依赖,根据 的说法,这可能是导致我遇到 C2039 错误的问题的原因。谁能帮我切这个圈子?

我有两个模板 classes 并且模板 class tXmlGeometry<Part> 有一个成员函数应该声明模板 class tXmlStraightLine 的实例。两者都在命名空间 nXml 内,但编译器抱怨 tXmlStraightLine 不是 nXml 的成员。 我不得不说我将 tXmlGeometry.h 绑定到 tXmlStraightLine header 但是当我尝试同时将 tXmlStraightLine.h 绑定到 tXmlGeometry header 时出现错误。我也只是尝试从 tXmlStraightLine header 中删除 #include nXml/tXmlGeometry 但无济于事。

下面是命名空间 nXml:

中 tXmlGeometry 模板 class 的简化代码
namespace nXml
{
    template<class Part>
    class tXmlGeometry : public tXmlNode<Part> 
    {
    public:
        tXmlGeometry(Part* part);
        ~tXmlGeometry();
        
        void AddStraightLine2D(const pugi::xml_node& node) {};
    };
}
;

以及导致问题的 AddStraightLine2D 方法的实现:

template<class Part>
inline void nXml::tXmlGeometry<Part>::AddStraightLine2D(const pugi::xml_node& this_node)
{
    nXml::tXmlStraightLine<Part> straightline_xml(this);
    //do more stuff
}

这是 tXmlStraightLine 模板的简化代码 class:

namespace nXml
{
    template<class Part>
    class tXmlStraightLine : public tXmlSegment2D<Part>
    {
    public:
        tXmlStraightLine(tXmlGeometry<Part>* geo, const int npos);
        ~tXmlStraightLine();
    }
    ;
}
;

有人可以告诉我如何避免这种循环依赖吗?

编辑:我更正了成员函数命名中的一个错误。

因为它们都是模板 类,我会考虑将它们放在同一个标​​题中。 为了避免依赖性问题,您可以将声明和定义分开。像这样:

namespace nXml
{
    // tXmlGeometry<Part> declaration
    template<class Part>
    class tXmlGeometry : public tXmlNode<Part> 
    {
    public:
        tXmlGeometry(Part* part);
        ~tXmlGeometry();
        
        inline void AddStraightLine2D(const pugi::xml_node& this_node);
    };

    // tXmlStraightLine  declaration
    template<class Part>
    class tXmlStraightLine : public tXmlSegment2D<Part>
    {
    public:
        tXmlStraightLine(tXmlGeometry<Part>* geo, const int npos);
        ~tXmlStraightLine();
    };

    // tXmlGeometry<Part> definitions
    template<class Part>
    inline void nXml::tXmlGeometry<Part>::AddStraightLine2D(const pugi::xml_node& this_node)
    {
        nXml::tXmlStraightLine<Part> straightline_xml(this);
        //do more stuff
    }
}
;