首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免循环依赖导致错误C2039?

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

Stack Overflow用户
提问于 2021-05-12 11:03:28
回答 1查看 117关注 0票数 0

我仍然在努力学习C++,现在产生了一个循环依赖关系,根据C2039: Class is not a member of Namespace的说法,这可能是导致我的问题的原因--我得到了一个C2039错误。谁能帮我切这个圆圈吗?

我有两个模板类,模板类tXmlGeometry<Part>有一个成员函数,它将声明模板类tXmlStraightLine的一个实例。两者都在名称空间nXml中,但编译器抱怨tXmlStraightLine不是nXml的成员。我不得不说,我将tXmlGetimey.h绑定到tXmlStraightLine头中,但是当我试图同时将tXmlStraightLine.h绑定到tXmlGeometry头时,会得到一个错误。我还尝试将#include nXml/tXml几何学从tXmlStraightLine头中删除,但没有效果。

下面是命名空间nXml中的nXml模板类的简化代码:

代码语言:javascript
复制
namespace nXml
{
    template<class Part>
    class tXmlGeometry : public tXmlNode<Part> 
    {
    public:
        tXmlGeometry(Part* part);
        ~tXmlGeometry();
        
        void AddStraightLine2D(const pugi::xml_node& node) {};
    };
}
;

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

代码语言:javascript
复制
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模板类的简化代码:

代码语言:javascript
复制
namespace nXml
{
    template<class Part>
    class tXmlStraightLine : public tXmlSegment2D<Part>
    {
    public:
        tXmlStraightLine(tXmlGeometry<Part>* geo, const int npos);
        ~tXmlStraightLine();
    }
    ;
}
;

有人能告诉我如何避免循环依赖吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-12 12:09:36

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

代码语言:javascript
复制
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
    }
}
;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67502381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档