c++中关于模板的typename和class的区别

       模板最初的目的只是为了对类类型进行泛型操作的定义,因此用class关键字声明泛型类型。在之后的进化过程中发现了模板相互调用时产生的::操作符有二义性,即编译器不能判定::后的标示符是类的类型成员,还是类的数据成员,默认情况下,编译器假定这样的标示符指定的是数据成员,而不是类型。因此引入typename关键字用于告诉编译器将::符号后的标示符看作是类型,而且必须显式告诉。

template<class T, int N>
class Test
{
public:
	typedef T ElemType;
	enum{ LEN = N };

	ElemType array[LEN];
};

/************************************
如果要在函数模板内部使用在类中定义的类型成员(ElemType),
必须在该成员名前加上typename关键字,以告知编译器将该成员当做类型
************************************/
template<class T>
void test_copy( T& test,  typename T::ElemType a[], int len )
{
	int l = (len <  T::LEN) ? len :  T::LEN;

	for(int i=0; i<l; i++)
	{
		test.array[i] = a[i];
	}
}


int main( )
{
	Test<int, 5> t1;
	Test<float, 3>t2;

	int ai[] = {5, 4, 3, 2, 1, 0};
	float af[] = {0.1, 0.2, 0.3};

	test_copy(t1, ai, 6);
	test_copy(t2, af, 3);

	for(int i=0; i<t1.LEN; i++)
	{
		cout<<t1.array[i]<<endl;
	}

	for(int i=0; i<t2.LEN; i++)
	{
		cout<<t2.array[i]<<endl;
	}


	cout<<"Press the enter key to continue........";
	cin.get();

	return 0;
}

 

       因此如果拿不准是否需要以typename指明一个名字是一个类型,那么显式指定它是个好主意。在类型之前指定typename没有害处,因此,即使typename是不必要的,也没有关系。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值