类模板实例化错误:未在此范围内声明类型

时间:2015-04-26 22:34:09

标签: c++ templates compiler-errors

所以我正在为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:错误:未在此范围内声明“类型”

在我开始使用模板之前,这些问题不存在,即,如果我明确定义了所有变量类型,我的类工作正常。所以,我不确定我的模板定义有什么问题?如果有人可以提供帮助,我真的很感激。

谢谢!

2 个答案:

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

  1. 您忘了添加

    template <typename Type>
    

    在功能定义之前。

  2. 从函数体中删除Type。当您添加Type时,您声明了三个与类成员无关的函数变量。

  3. template <typename Type>
    ThreeVector<Type>::ThreeVector() {
        mx=0;
        my=0;
        mz=0;
    }
    

    通过使用初始化列表语法初始化成员,可以使其更好:

    template <typename Type>
    ThreeVector<Type>::ThreeVector() : mx(0), my(0), mz(0) { }