我对c ++中的模板循环依赖有疑问。 我有两个模板类,Rotation3和Vector3。 旋转保持水平和垂直旋转,而矢量具有x y和z分量。
我希望每个类都有另一个构造函数:
Vector3<T>::Vector3(const Rotation3<T>& rot)
和...
Vector3<T>::Rotation3(const Vector3<T>& vec)
但是,因为模板不能放在.cpp文件中,并且必须在.h中,这意味着Vector3.h和Rotation3.h必须相互包含才能互相使用为他们的建设者。这可能吗?
感谢您的帮助,我对c ++很陌生,我真的很想知道有经验的人会如何设计这个。
答案 0 :(得分:2)
使用不在文件开头附近但有效的#include
指令有点奇怪。包括警卫比平常更重要。
// Vector3.hpp
#ifndef VECTOR3_HPP_
#define VECTOR3_HPP_
template<typename T> class Rotation3;
template<typename T> class Vector3
{
public:
explicit Vector3(const Rotation3<T>&);
};
#include "Rotation3.hpp"
template<typename T>
Vector3<T>::Vector3(const Rotation3<T>& r)
{ /*...*/ }
#endif
// Rotation3.hpp
#ifndef ROTATION3_HPP_
#define ROTATION3_HPP_
template<typename T> class Vector3;
template<typename T> class Rotation3
{
public:
explicit Rotation3(const Vector3<T>&);
};
#include "Vector.hpp"
template<typename T>
Rotation3<T>::Rotation3(const Vector3<T>& v)
{ /*...*/ }
#endif
答案 1 :(得分:1)
如果Vector3和Rotatio3都是模板,那么什么都不会发生,因为模板在专门化或使用之前不会生成对象(例如vector3)。
您可以通过合成或继承创建另一个包含vector3和Rotation3的类,并根据需要使用它们。这也可以是模板(模板Vector3,模板Rotation3&gt;示例)
答案 2 :(得分:0)
像往常一样,你可以宣布一些东西,而且这个声明可能已经足够用了。模板声明与其他模板类似,只是省略了定义部分。
也可以在类外定义模板类成员函数。您可以将标题拆分为仅定义类,另一个实现函数。然后你可以将它们包含在交错中。