<b>C++箴言:理解typename的两个含义</b>[VC/C++编程]
本文“<b>C++箴言:理解typename的两个含义</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么差别?
template<class T> class Widget; // uses "class"
template<typename T> class Widget; // uses "typename"
答案:没什么差别.在声明一个 template type parameter(模板范例参数)的时刻,class 和 typename 意味着完好相同的东西.一些程序员更喜好在全部的时间都用 class,因为它更简单输入.其他人(包含我本人)更喜好 typename,因为它表示着这个参数不必如果一个 class type(类范例).少数开辟者在任何范例都被答应的时刻利用 typename,而把 class 保存给仅承受 user-defined types(用户定义范例)的场所.但是从 C++ 的概念看,class 和 typename 在声明一个 template parameter(模板参数)时意味着完好相同的东西.
但是,C++ 并不老是把 class 和 typename 视为平等的东西.有时你必须利用 typename.为了理解这一点,我们不得不谈论你会在一个 template(模板)中触及到的两种名字.
假定我们有一个函数的模板,它能获得一个 STL-compatible container(STL 兼容容器)中持有的能赋值给 ints 的对象.进一步假定这个函数只是简单地打印它的第二个元素的值.它是一个用胡涂的办法实现的胡涂的函数,并且就像我下面写的,它乃至不能编译,但是请将这些事前放在一边——有一种办法能发现我的笨拙:
template<typename C> // print 2nd element in
void print2nd(const C& container) // container;
{
// this is not valid C++!
if (container.size() >= 2) {
C::const_iterator iter(container.begin()); // get iterator to 1st element
++iter; // move iter to 2nd element
int value = *iter; // copy that element to an int
std::cout << value; // print the int
}
}
我突出了这个函数中的两个 local variables(部分变量),iter 和 value.iter 的范例是 C::const_iterator,一个依靠于 template parameter(模板参数)C 的范例.一个 template(模板)中的依靠于一个 template parameter(模板参数)的名字被称为 dependent names(依靠名字).当一个 dependent names(依靠名字)嵌套在一个 class(类)的内部时,我称它为 nested dependent name(嵌套依靠名字).C::const_iterator 是一个 nested dependent name(嵌套依靠名字).实际上,它是一个 nested dependent type name(嵌套依靠范例名),也就是说,一个触及到一个 type(范例)的 nested dependent name(嵌套依靠名字).
以上是“<b>C++箴言:理解typename的两个含义</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |