typename
感谢 http://dev.yesky.com/13/2221013.shtml 让我受益匪浅
在c++中,typename用于类模板中。
<1> template <class T> class enable{}
<2>template <typename T> class enable{}
两种写法中,class 和typename的作用是一样的。
那不一样的呢?
请看以下的例子:
template <typename T>
void show_message(const T & cs)
{
if(cs.Size()>0)
{
T::iterator iter = cs.begin();
}
}
以上抄袭别人的例子,请继续往下看:
我们注意到红色部分。
按照我的理解是 T::iterator 是iter的类型。准确的说,是依赖模板参数的的类型。下面是定义:
一个模版定义中,依赖一个模板参数的名字称作依赖名字。
下面是我抄录boost中的一段代码。bast_type 就是依赖名字。
template< class A1 > class list1: private storage1< A1 >
{
private:
typedef storage1< A1 > base_type;
。。。
}
继续看定义:
当一个依赖名字嵌套在一个类的内部时,我们称为嵌套依赖名字。
T::iterator就是一个嵌套依赖名字。
那问题来了。
如果T::iterator不是一个类型,或者说cs中有一个静态数据程序叫做iterator呢? 它是可能的
iter 仅仅在 cs::iterator 是一个 类型时才有意义,但是我们没有告诉 C++ 它是,而 C++ 就假定它不是。
要想转变这个形势,我们必须告诉 C++ cs::iterator 是一个 类型。我们将 typename 放在紧挨着它的前面来做到这一点:
template <typename T>
void show_message(const T & cs)
{
if(cs.Size()>0)
{
typename T::iterator iter = cs.begin();
}
}
就是这样。
未完待续。。。