因此,我正在为c++类编写粒子加速器代码,而Im在要求使用Im的初始类设置方面遇到麻烦。教授希望我们为类使用模板,但是当我尝试实现它们时,我收到许多错误。例如:
#include <iostream>
#include <cmath>
using namespace std;
template <class Type>
class ThreeVector {
private:
Type mx;
Type my;
Type mz;
public:
ThreeVector();
ThreeVector(Type x=0, Type y=0, Type z=0);
};
ThreeVector<Type>::ThreeVector() {
Type mx=0;
Type my=0;
Type mz=0;
}
ThreeVector<T>::ThreeVector(Type x, Type y, Type z) {
mx=x;
my=y;
mz=z;
}
是我的头文件的一部分(该类必须位于头文件中)。当我运行程序时(如果需要可以提供),它给我以下错误:
ThreeVector.h:30:13:错误:在此范围内未声明“类型”
ThreeVector.h:30:17:错误:模板参数1无效
ThreeVector.h:在函数“int ThreeVector()”中:
ThreeVector.h:30:32:错误:“int ThreeVector()”被重新声明为另一种符号
ThreeVector.h:6:7:注意:先前的声明“模板类ThreeVector”
ThreeVector.h:31:2:错误:在此范围内未声明“类型”
ThreeVector.h:32:7:错误:在“我的”之前应为“;”
ThreeVector.h:33:7:错误:预期的“;”在“mz”之前
ThreeVector.h:在全局范围内:
ThreeVector.h:35:13:错误:在此范围内未声明“类型”
这些问题在我开始使用模板之前不存在,即,如果我明确定义所有变量类型,则我的类可以正常工作。因此,我不确定自己的模板定义有什么问题吗?如果有人可以提供帮助,Id会非常感激。
谢谢!
最佳答案
您必须为属于模板类的一部分但在类定义之外定义的方法声明模板参数。因此,要进行函数定义,您必须执行以下操作:
template<class Type>
ThreeVector<Type>::ThreeVector() {
mx=0;
my=0;
mz=0;
}
template<class Type>
ThreeVector<T>::ThreeVector(Type x, Type y, Type z) {
mx=x;
my=y;
mz=z;
}
这是因为当方法声明在类定义之外时,模板化类型不可用于方法声明。要解决此问题,您必须添加带有与原始类相同的参数的
template< ... >
。另外,您应该使用初始化程序列表来初始化成员。这会使您的构造函数如下所示:
template<class Type>
ThreeVector<Type>::ThreeVector() :
mx(0),
my(0),
mz(0)
{
}