#include <iostream>
#include <list>
template <typename T>
class CCustomerList
{
public:
void push(T item)
{
m_customer.push_back(item);
}
void show_item()
{
CCIterator it = m_customer.begin();
while(it != m_customer.end())
{
std::cout<<(*it)<<std::endl;
++it;
}
}
private:
typedef std::list<T> CustomerContainer;
typedef typename CustomerContainer::iterator CCIterator;
CustomerContainer m_customer;
};
int main(int argc, char *argv[])
{
CCustomerList<int> c;
for(int i=0; i<10; ++i) c.push(i);
c.show_item();
return 0;
}
这里说的是CCustomerList里的
typedef typename CustomerContainer::iterator CCIterator;
语句。
在这条语句中必须加上typename关键字,不然编译时会报错。
根据《effective STL》里的解释: CustomerContainer::iterator 是一个依赖形式类型参数T的一种类型,所以必须在它前面放上typename这个词。
template关键字还可以用在中间:
Template names can not only occur after a :: but also after a -> or . in a class member access. You need to insert the keyword there too.
如:Protocol_v2<alloc_t> * pack = alloc->template malloc<Protocol_v2<alloc_t> >();
更多内容见: