0
#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]

如何解决?谢谢

4

2 回答 2

4
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

{}是构造函数的整个函数体。它本质上是一个空构造函数,因为所有工作都在初始化列表中完成。

可以重写它以更好地了解大括号只是您运行的 mill 函数体。

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"被视为类型为 的字符串文字const char *'a'另一方面,被视为char您和您的构造函数所期望的 a 。

于 2013-01-02T07:27:51.327 回答
3
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

这定义了一个函数。函数有一个主体。函数体被定义为大括号之间的东西(即:{})。所以即使函数是空的,你也必须用一对大括号来定义它。

于 2013-01-02T07:27:58.760 回答