今天第一篇博文,以后就通过博客来多多积累学习经验了!
关于这种报错如今天遇到的 error: expected nested-name-specifier before 'const_iter' ,
friend ostream & operator <<(ostream & out,const Array<T>&aa){
out<<"[";
typename const_iter it=aa.begin();
if(it!=aa.end()){
out<<*it;
if(it!=aa.end()){
for(;it<aa.end();it++)
out<<","<<*it;
}
这部分中编译就出错:
E:\iterm\A.h:56: error: expected nested-name-specifier before 'const_iter'
typename const_iter it=aa.begin();
^
后来发现,关于模板中的typename 不能乱用,其目的在于表示相关的类类型的迭代器的返回值。
<pre name="code" class="html">template<typename T>
class A_iterator{
public:
A_iterator(){
}//constructor
A_iterator(typename list<T>::iterator it){
this->it = it;
}//construtor with index
typename list<T>::iterator getIt() const{
return it;
}//function getIt
T& operator*(){
return *it;
}//overloading operator *
typename list<T>::iterator& operator++(){
++it;
return it;
}//overloading operator ++
typename list<T>::iterator operator++(int){
list<int>::iterator old = it;
it++;
return old;
}//overloding operator ++ in back sequnce
bool operator!=(const A_iterator& b){
return it!=b.getIt();
}//overloading operator !=
bool operator==(const A_iterator& b){
return it==b.getIt();
}//overloding operator ==
private:
typename list<T>::iterator it;
};
类似这种形式是我在一个类中使用typename用来表示这种返回与类型相同的类型。
因为std::list<T>在实例化之前,编译器没办法判断iterator到底是成员还是类型,所以会出错。
在std::list<T>::iterator前加上typename关键字就行了。