当前位置:首页 科普知识 TypeName

TypeName

发布时间:2023-09-14 18:38:01

"typename"是一个C++程序设计语言中的关键字。相当用于泛型编程时是另一术语"class"的同义词。这个关键字用于指出模板声明(或定义)中的依赖的名称(dependent names)是类型名,而非变量名。

TypeName介绍

"typename"是一个C++程序设计语言中的关键字。相当用于泛型编程时是另一术语"class"的同义词。这个关键字用于指出模板声明(或定义)中的依赖的名称(dependent names)是类型名,而非变量名。

TypeName

TypeNametypename 关键字

TypeNameclass关键字的同义词

这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如:

// 定义一个返回参数中较大者的通用函数template <typename T>const T& max(const T& x, const T& y){  return x > y ? x : y;}

这种情况下,typename可用另一个等效的关键字class代替,如下代码片段所示:

// 定义一个返回参数中较大者的通用函数template <class T>const T& max(const T& x, const T& y){  return x > y ? x : y;}

以上两段代码没有功能上的区别。

TypeName类型名指示符

考虑下面的错误代码:

template <class T>void foo(const T& t){    // 声明一个指向某个类型为T::bar的对象的指针    T::bar * p;}struct StructWithBarAsType{    typedef int bar;}; int main(){    StructWithBarAsType x;    foo(x);}

这段代码看起来能通过编译,但是事实上这段代码并不正确。因为编译器并不知道T::bar究竟是一个类型的名字还是一个某个变量的名字。究其根本,造成这种歧义的原因在于,编译器不明白T::bar到底是不是“模板参数的非独立名字”,简称“非独立名字”。注意,任何含有名为“bar”的项的类T,都可以被当作模板参数传入foo()函数,包括typedef类型、枚举类型或者变量等。

为了消除歧义,C++语言标准规定:

A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.

意即出现上述歧义时,编译器将自动默认bar为一个变量名,而不是类型名。所以上面例子中的代码 T::bar * p 会被解释为乘法,而不是声明p为指向T::bar类型的对象的指针。

如果还有另一个名为StructWithBarAsValue类型,如下:

struct StructWithBarAsValue{    int bar;};

那么,编译器将以完全不同的方式来解释 T::bar * p 的含义。

解决问题的最终办法,就是显式地告诉编译器,T::bar是一个类型名。这就必须用typename关键字,例如:

template <typename T>void foo(const T& t){       // 声明一个指向某个类型为T::bar的对象的指针    typename T::bar * p;}

这样,编译器就确定了T::bar是一个类型名,p也就自然地被解释为指向T::bar类型的对象的指针了。

TypeNameTypeName 函数

TypeName函数 返回一个 String,提供有关变量的信息。

语法TypeName(varname)必要的 varname 参数是一个 Variant,它包含用户定义类型变量之外的任何变量。

说明TypeName 所返回的字符串可以是下面列举的任何一个字符串:

字符串变量对象类型为 objecttype 的对象

TypeName

Byte位值

Integer整数

Long长整数

Single单精度浮点数

Double双精度浮点数

Currency货币

Decimal十进制值

Date日期

String字符串

bool布尔值

Error错误值

Empty未初始化

Null无效数据

Object对象

Unknown类型未知的对象

Nothing不再引用对象的对象变量

如果 varname 是一个数组,则返回的字符串可以是任何一个后面添加了空括号的可能的返回字符串(或 Variant)。例如,如果 varname 是一个整数数组,则 TypeName 返回 "Integer()"。

TypeName

Typename关键字 告诉编译把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:

1一个唯一的name(可以作为类型理解),嵌套在另一个类型中;

2 依赖于一个模板参数,就是说模板参数在某种程度上包含这个name,当模板参数是编译器在指认一个类型时便会产生误解

为了保险起见,应该在所有编译可能错把一个type当成一个变量的地方使用typename,如果你的类型在模板参数中是有限制的,那就必须使用typename

温馨提示:
本文【TypeName】由作者 爱百科 转载提供。 该文观点仅代表作者本人, 自学教育网 信息发布平台,仅提供信息存储空间服务, 若存在侵权问题,请及时联系管理员或作者进行删除。
(c)2008-2025 自学教育网 All Rights Reserved 汕头市灵创科技有限公司
粤ICP备2024240640号-6