template question 1
为了分析模板定义,编译器必须能够区分出是类型以及不是类型的表达式。对于编译器来说,它并不总是能够区分出模板定义中的哪些表达式是类型。比如如果编译器在模板定义中遇到表达式R::name ,且R 这个模板类型参数代表了一个类,那么name引用的是R的一个类型成员吗?编译器无法知道name是否为一个类型,因为它只有在模板被实例化之后才能找到R表示的是类的定义。
告诉编译器一个表达式是类型表达式的机制是在表达式前加上关键字typename 。
这句话我没看明白,到底是什么意思呢?最好举个例子,谢谢。
问题点数:20、回复次数:10Top
1 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-03 19:39:34 得分 0
template<class T>
class test
{
public:
T::INT kk; //²»Äܿ϶¨INTÊÇÀàÐÍ»¹ÊDZäÁ¿
typename T::INT kk; //Ç¿ÖÆËµÃ÷ÊÇÀàÐÍ test<U> obj1;³ö´í
};
class T
{
public:
typedef int INT;
};
class U
{
public:
int INT;
};
int main()
{
test<T> obj;
test<U> obj1;
system("pause");
return 0;
}
Top
2 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-03 19:41:35 得分 10
template<class T>
class test
{
public:
T::INT kk; //不能确定INT是类型还是变量
typename T::INT kk; //强制说明是类型 test<U> obj1;出错
};
Top
3 楼cunsh(村少)回复于 2006-03-03 20:41:19 得分 10
class T{
//...
public:
typedef int INT;
};
template<class T>
class test
{
public:
T::INT *kk; //如果你想让 kk 为整形指针.你可能这么写.
};
现在改一下class T .
class T {
public:
static int INT;
};
那在test类中你写的 T::INT *kk; 就可能是一个乘法语句.
最后没办法.你只好拿出了typename这个关键字 告诉编译器 T::INT是个类型.Top
4 楼tommy851027(努力,努力!)回复于 2006-03-04 14:39:36 得分 0
没看明白Top
5 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-04 15:15:14 得分 0
因为模板是编译时已确定了参数类型,不是到运行时来确定.因此对于楼上给出的例子中:
T::INT *kk;
//如果你想让 kk 为整形指针.你可能这么写.但是当你实例化为T时(test<T> obj),却成了乘号.本来是做指针的,却成了乘号,肯定程序要出问题了噻,但是编译时又不一定会出错.
因此只好使用typename,这样可以强制申请它是一个类型.让编译器帮你发现错误(当你传入T为类型参数时)
Top
6 楼tommy851027(努力,努力!)回复于 2006-03-04 15:17:55 得分 0
有class U 什么事啊?
各位大哥最好来个简单明了点的小例子。Top
7 楼xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)回复于 2006-03-04 15:35:21 得分 0
还有在T中已经typedef int INT;了,而在U中又int INT;
这 int INT;不是等同于 int int;了吗,这是什么意思啊Top
8 楼tommy851027(努力,努力!)回复于 2006-03-04 15:37:56 得分 0
楼上的问题我也想知道Top
9 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-04 15:48:23 得分 0
这 int INT;不是等同于 int int;了吗
======================================
T 和 U 是两个不同的类;
可能T类的设计者是把int定义为INT来用的,而U类的设计者又定义了个INT的变量.这是很有可能的吧.
其实我那个例子都还不能很明显的说明问题.
cunsh(村少) ( )的例子就很明显了.原因我上面已经说过.加typename就是为了让编译器更加严谨些
test<T> obj;时本来我们已经出错了,但是它没有发现(语法正常)Top
10 楼tommy851027(努力,努力!)回复于 2006-03-04 19:32:47 得分 0
不好意思啊,我还是不大清除,我再好好看看吧,我在网上找了半天也没找着一个完整的程序来解释这个。晕啊Top




