为什么{}无法移除?为什么char类型变量无法转移?

时间:2013-01-02 07:25:42

标签: c++ templates

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

如何解决?感谢

2 个答案:

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

这定义了一个函数。功能有一个身体。函数体被定义为花括号之间的东西(即:{})。因此,即使函数为空,也必须使用一对大括号来定义它。