模板中,class与typename的差别:
在很多人看来,两者没有上门区别,但有的时候,必须使用typename,代码如下:
template<class T>
class MyIter
{
public:
typedef T value_type;
value_type *ptr;
T& operator*()const{return *ptr;}
MyIter(T *p=0):ptr(p){};
//....
};
template<typename T1, typename T2>
typename T1::value_type Testfun(T1 &ct1, T2 &ct2)
{
if(ct2.size()>=2){
typename T2::const_iterator c2Itr(ct2.begin());
++c2Itr;
cout<<*c2Itr<<endl;
}
return *ct1;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vtr;
vtr.push_back(1);
vtr.push_back(2);
auto_ptr<char> ptr(new char);
*ptr = 'A';
MyIter<char> myItr(ptr.get());
cout<<Testfun<MyIter<char>, std::vector<int>>(myItr, vtr)<<endl;
return 0;
}
C++模板中若遇到嵌套名字,默认是不认为其为类型,编译器会考虑到各种输入,比如是静态变量,全局变量等等。所以必须在前面添加typename声明它是一个类型