#ifndef ClassTemplate_HH
#define ClassTemplate_HH
using std::cout;
using std::endl;
template<typename T1,typename T2>
class myClass{
private:
T1 I;
T2 J;
public:
myClass(T1 a, T2 b);//Constructor
void show();
};
//这是构造函数
//注意这些格式
template <typename T1,typename T2>
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
//这是void show();
template <typename T1,typename T2>
void myClass<T1,T2>::show()
{
cout<<"I="<<I<<", J="<<J<<endl;
}
#endif
在上面的头文件中,{}
无法删除,为什么?它的目的是什么?
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
以下是源文件:
#include <iostream>
#include "ClassTemplate.h"
using std::cout;
using std::endl;
int main()
{
myClass<int,int> class1(3,5);
class1.show();
myClass<int,char> class2(3,"a");
class2.show();
myClass<double,int> class3(2.9,10);
class3.show();
}
错误编译结果如下:
$ g++ ClassTemplate_Test.cpp
ClassTemplate_Test.cpp: In function ‘int main()’:
ClassTemplate_Test.cpp:12:36: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
ClassTemplate.h:20:1: error: initializing argument 2 of ‘myClass<T1, T2>::myClass(T1, T2) [with T1 = int, T2 = char]’ [-fpermissive]
如何解决?感谢
答案 0 :(得分:4)
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
这里{}
是构造函数的整个函数体。它本质上是一个空构造函数,因为所有工作都在initialization list完成。
可以重写它以更好地看到大括号只是你的磨机功能体的运行。
myClass<T1,T2>::myClass(T1 a,T2 b)
:I(a),J(b)
{
}
关于编译错误,从“”到“'的简单修复就可以解决它,
更改
myClass<int,char> class2(3,"a");
到
myClass<int,char> class2(3,'a');
这是因为"a"
被视为string literal,其类型为const char *
。另一方面,'a'
被视为char
,正如您和构造函数所期望的那样。
答案 1 :(得分:3)
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
这定义了一个函数。功能有一个身体。函数体被定义为花括号之间的东西(即:{})。因此,即使函数为空,也必须使用一对大括号来定义它。