Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类模板实例化错误:未在此范围内声明类型 我写了一个C++类的粒子加速器代码,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; } #包括 #包括 使用名称空间std; 模板 第三类向量{ 私人: mx型; 输入my; mz型; 公众: 三向量(); 三矢量(x型=0,y型=0,z型=0); }; ThreeVector::ThreeVector(){ 类型mx=0; 输入my=0; 类型mz=0; } ThreeVector::ThreeVector(x型、y型、z型){ mx=x; my=y; mz=z; }_C++_Templates_Compiler Errors - Fatal编程技术网

类模板实例化错误:未在此范围内声明类型 我写了一个C++类的粒子加速器代码,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; } #包括 #包括 使用名称空间std; 模板 第三类向量{ 私人: mx型; 输入my; mz型; 公众: 三向量(); 三矢量(x型=0,y型=0,z型=0); }; ThreeVector::ThreeVector(){ 类型mx=0; 输入my=0; 类型mz=0; } ThreeVector::ThreeVector(x型、y型、z型){ mx=x; my=y; mz=z; }

类模板实例化错误:未在此范围内声明类型 我写了一个C++类的粒子加速器代码,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; } #包括 #包括 使用名称空间std; 模板 第三类向量{ 私人: mx型; 输入my; mz型; 公众: 三向量(); 三矢量(x型=0,y型=0,z型=0); }; ThreeVector::ThreeVector(){ 类型mx=0; 输入my=0; 类型mz=0; } ThreeVector::ThreeVector(x型、y型、z型){ mx=x; my=y; mz=z; },c++,templates,compiler-errors,C++,Templates,Compiler Errors,是头文件的一部分(类必须位于头文件中)。当我运行我的程序时(如果需要可以提供),它会给我以下错误: ThreeVector.h:30:13:错误:未在此作用域中声明“Type” ThreeVector.h:30:17:错误:模板参数1无效 ThreeVector.h:在函数“int ThreeVector()”中: ThreeVector.h:30:32:错误:“int ThreeVector()”重新声明为不同类型的符号 ThreeVector.h:6:7:注意:前面的声明“模板类ThreeV

是头文件的一部分(类必须位于头文件中)。当我运行我的程序时(如果需要可以提供),它会给我以下错误:

ThreeVector.h:30:13:错误:未在此作用域中声明“Type”

ThreeVector.h:30:17:错误:模板参数1无效

ThreeVector.h:在函数“int ThreeVector()”中: ThreeVector.h:30:32:错误:“int ThreeVector()”重新声明为不同类型的符号

ThreeVector.h:6:7:注意:前面的声明“模板类ThreeVector”

ThreeVector.h:31:2:错误:未在此作用域中声明“Type”

ThreeVector.h:32:7:错误:应为“;”在“我的”之前

ThreeVector.h:33:7:错误:应为“;”在“mz”之前

ThreeVector.h:在全局范围内: ThreeVector.h:35:13:错误:未在此作用域中声明“Type”

这些问题在我开始使用模板之前并不存在,也就是说,如果我显式定义所有变量类型,我的类就可以正常工作。所以,我不确定我的模板定义有什么问题?如果有人能帮忙,我真的很感激


谢谢

必须为属于模板类但在类定义之外定义的方法声明模板参数。因此,要创建函数定义,必须执行以下操作:

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;
}
模板
ThreeVector::ThreeVector(){
mx=0;
my=0;
mz=0;
}
模板
ThreeVector::ThreeVector(x型、y型、z型){
mx=x;
my=y;
mz=z;
}
这是因为当方法声明位于类定义之外时,模板化类型对它们不可用。要解决此问题,您必须添加
模板<…>代码

此外,还应该使用初始值设定项列表来初始化成员。这将使您的构造函数如下所示:

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

}
模板
ThreeVector::ThreeVector():
mx(0),
我的(0),
mz(0)
{
}
  • 你忘了加上

    template <typename Type>
    
    通过使用初始值设定项列表语法初始化成员,可以使其变得更好:

    template <typename Type>
    ThreeVector<Type>::ThreeVector() : mx(0), my(0), mz(0) { }
    
    模板
    ThreeVector::ThreeVector():mx(0),my(0),mz(0){}
    
    如果没有给出参数,应该调用哪个构造函数?尝试将
    模板
    放在类外声明的方法前面。(用模板参数中的任何说明符替换T。)抱歉,快速更正:ThreeVectoor的一个实例已更改为ThreeVector。。另外,模板不是已经在类外声明了吗?
    template
    只适用于紧跟其后的声明或定义。我不知道这一点。谢谢你的澄清,克里斯,它现在似乎起作用了!我们没有被介绍初始值设定项列表语法,它与我上面发布的代码有什么不同?只是想更好地理解,以备将来使用@RossBauer,它初始化成员,而不是进行默认初始化,然后再分配给它们。后者甚至不是在所有情况下都能工作,比如如果它是一个没有默认构造函数的类。
    template <typename Type>
    ThreeVector<Type>::ThreeVector() : mx(0), my(0), mz(0) { }