c++ 模板參數做容器參數迭代器報錯 vector ::const_iterator,typename const報錯


錯誤1:

template<class T>
void temp(std::vector<T>& container)
{
        std::vector<T>::const_iterator p; //error: expected ‘;’ before ‘p’
        for(p = container.begin(); p != container.end(); ++p)
        {
                //...
        }
}

 

解決方法:

std::vector<T>::const_iterator p; //error: expected ‘;’ before ‘p’

typename std::vector<T>::const_iterator p;

原因:
 1、首先類除了可以定義數據成員或函數成員之外,還可以定義類型成員。
 2、使用std::vector<T>::const_iterator時,編譯器假定這樣的名字指定的是數據成員,而不是數據類型成員。
 3、如果希望編譯器將const_iterator當做類型,則必須顯示告訴編譯器這樣做,這就是我們加typename的原因。

 

錯誤2:typename const報錯

template<typename T>
inline static bool Insert(std::list<T> & dest, const T & val)
{
    bool bDuplicate = false;
    typename std::list<T>::iterator iter = dest.begin();
    typename const std::list<T>::iterator end = dest.end();
    for ( ; end != iter; ++iter)
    {
        if(*iter >= val)
        {
            bDuplicate = (*iter == val);
            break;
        }
    }

    if(!bDuplicate)
    {
        // 不重復則插入
        dest.insert(iter, val);
        return true;
    }

    return false;
}

解決方法:

typename const std::list<T>::iterator end = dest.end();

const typename std::list<T>::iterator end = dest.end();

原因:

應該是typename后面接的下一個單詞須是個類型名,而不應是const

 

更深入理解可以看nested dependent name(嵌套依賴名字)


 本人以前的幼稚解決方法:

__gnu_cxx::__normal_iterator<T const*, std::vector<T, std::allocator<T> > > p;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM