1. ホーム
  2. c++

error: 'const_iter' solution の前に期待されるネストされた名前指定子

2022-02-21 08:24:41

今日最初のブログ記事、これからブログを通じてもっと勉強します

今日遭遇した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;
};





このような形は、型と同じ型を返すこの型を表すクラスで使っているものです。


std::list<T> はインスタンス化される前にイテレータがメンバーなのか型なのかをコンパイラが判断する方法がないため、エラーになります。

std::list<T>::iterator の前に typename キーワードを追加するだけです。