如何避免循环依赖导致错误 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
}
}
;
我仍在努力学习 C++,现在已经产生了循环依赖,根据
我有两个模板 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
}
}
;