template中typename

TypeName 函数 返回一个  String,提供有关 变量的信息。
语法TypeName(varname)必要的 varname 参数是一个  Variant,它包含用户定义类型 变量之外的任何变量。
说明TypeName 所返回的 字符串可以是下面列举的任何一个字符串:
字符串变量对象类型为 objecttype 的 对象
Byte位值
Integer整数
Long长整数
Single单精度浮点数
Double双精度浮点数
Currency货币
Decimal十进制值
Date日期
String字符串
bool布尔值
Error错误值
Empty未初始化
Null无效数据
Object对象
Unknown类型未知的对象
Nothing不再引用对象的对象变量
如果 varname 是一个 数组,则返回的字符串可以是任何一个后面添加了空括号的可能的返回字符串(或 Variant)。例如,如果 varname 是一个整数 数组,则 TypeName 返回 "Integer()"。
Typename 关键字  告诉 编译把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:
1一个唯一的name(可以作为类型理解),嵌套在另一个类型中;
2 依赖于一个模板参数,就是说模板参数在某种程度上包含这个name,当模板参数是编译器在指认一个类型时便会产生误解
为了保险起见,应该在所有编译可能错把一个type当成一个变量的地方使用typename,如果你的类型在模板参数中是有限制的,那就必须使用typename
例如:
函数模板:
template //指出;函数模板形参,实际上就是指“任何内置类型”或“用户定义类型”
T maximum(T value1, T value2)
{
if(value1 > value2)
{
return value1;
}
else
{
return value2;
}
}

typename关键字

" typename"是一个C++程序设计语言中的关键字。当用于泛型编程时是另一术语"class"的同义词。这个关键字用于指出模板声明(或定义)中的非独立性名称(dependent names)是类型名,而非变量名。以下是对于泛型编程中typename两种迥然不同的用法的解释。

编辑本段class关键字的同义词

这是一项C++编程语言泛型编程(或曰“模板编程”)的功能,typename关键字用于引入一个模板参数,例如:
// 定义一个返回参数中较大者的通用函数
templateconst
T& max(const T& x, const T& y)
{
if(y < x)
{
return x;
}
return y;
}
这种情况下,typename可用另一个等效的关键字class代替,如下代码片段所示:
// 定义一个返回参数中较大者的通用函数
templateconst
T& max(const T& x, const T& y)
{
if(y < x)
{
return x;
}
return y;
}
以上两段代码没有功能上的区别。

编辑本段类型名指示符

考虑下面的错误代码:
templatevoid foo(const T& t)
{
// 声明一个指向某个类型为T::bar的对象的指针
T::bar* p;
}
struct StructWithBarAsType
{
typedefint 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
void foo(const T& t)
{
// 声明一个指向某个类型为T::bar的对象的指针
typename T::bar* p;
}
这样,编译器就确定了T::bar是一个类型名,p也就自然地被解释为指向T::bar类型的对象的指针了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值