C ++模板依赖项

时间:2013-06-28 21:50:10

标签: c++ templates

我对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 ++很陌生,我真的很想知道有经验的人会如何设计这个。

3 个答案:

答案 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)

像往常一样,你可以宣布一些东西,而且这个声明可能已经足够用了。模板声明与其他模板类似,只是省略了定义部分。

也可以在类外定义模板类成员函数。您可以将标题拆分为仅定义类,另一个实现函数。然后你可以将它们包含在交错中。