typedef和typename区别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、typedef
用法:typedef 内置类型别名
关键字typedef对内置类型、类类型等进行重命名,使用重命名的类型,在使用上更加方便、简洁,特别注意:用typedef不会新增类型。
实例一:
//typedef 简单例子
typedef unsigned short Word; //对unsigned short内置类型进行重命名
Word wClickNum = 10; //用用户定义的新名字定义变量等同于unsigned short wClickNum
实例二:
//普通方式:定义结构体类型与变量
struct tag_Student
{
string strName;
unsigned short usMathResult;
};
struct tag_Student stStudent1;
//使用typedef可以使结构体定义更简洁
typedef struct
{
string strName;
unsigned short usMathResult;
}stStudent;
stStudent stPerson;//定义变量更加简洁
二、typename
用法:
关键字typename用来作为型别之前的标识符,主要应用在函数模板、类模板中,在template中也可以用class来声明。
函数模板:
我们可以定义一个通用的函数模板,而不是为每个类型都定义一个新函数,一个函数模板就是一个公式,可以生成特性类型的函数版本。
实例三
template
int Compare(const T& V1, const T& V2)
{ if (V1 < V2) { return -1;}
else if (V1 > V2) { return 1;}
else{ return 0; }
}
int _tmain(int argc, _TCHAR* argv[])
{
//调用一个函数模板时,通用编译器根据函数模板的实参来为我们推导T的类型
int nRet1 = Compare(10, 11); //实例化函数模板,T为int类型
int nRet2 = Compare(9.1, 9.8);//实例化函数模板,T为float 类型
return 0;
}
综合应用
代码如下:
template
class MyClass
{
public:
typedef typename T::SubType A;
public:
A a;
}
typedef typename T::SubType A;的含义是:A是某个类中的SubType类型,通过typedef来修饰,A为SubType类型的别名。typename是型别标识符。
特别的,如果有typename T::SubType *A语句中没有typename 修饰,该语句将被翻译成:SubType 与ptr的乘积,编译将会出错。”::“表示域标识符。
实例四
template
class MyClass
{ public:
typedef typename T::SubType A;
public:
A a;
public:
//默认构造函数
MyClass() { a =10;}
void PrintNum() { cout<<"a= "< class Q { public: //指定类Q中SubType类型 typedef int SubType; }; int _tmain(int argc, _TCHAR* argv[]) { //自定义模板, typedef、typename综合运用MyClass return 0;} object;//实例类模板object.PrintNum();