所以我正在为c ++类编写一个粒子加速器代码,并且我在初始类设置时遇到问题我被要求使用。教授希望我们为课程使用模板,但是当我尝试实现它们时,我收到了许多错误。例如:
#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:错误:预期';'在'my'之前
ThreeVector.h:33:7:错误:预期';'在'mz'之前
ThreeVector.h:在全球范围内: ThreeVector.h:35:13:错误:未在此范围内声明“类型”
在我开始使用模板之前,这些问题不存在,即,如果我明确定义了所有变量类型,我的类工作正常。所以,我不确定我的模板定义有什么问题?如果有人可以提供帮助,我真的很感激。
谢谢!
答案 0 :(得分:2)
您必须为属于模板类的方法声明模板参数,但这些方法是在类定义之外定义的。因此,要制作函数定义,必须执行以下操作:
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)
{
}
答案 1 :(得分:1)
您忘了添加
template <typename Type>
在功能定义之前。
从函数体中删除Type
。当您添加Type
时,您声明了三个与类成员无关的函数变量。
template <typename Type>
ThreeVector<Type>::ThreeVector() {
mx=0;
my=0;
mz=0;
}
通过使用初始化列表语法初始化成员,可以使其更好:
template <typename Type>
ThreeVector<Type>::ThreeVector() : mx(0), my(0), mz(0) { }