g ++编译器无法识别嵌套模板类

时间:2013-06-06 17:58:28

标签: c++ templates compiler-errors g++

我有一个模板数组类,该数组在内存中具有连续数量的单元格。该数组还有一个iterator => Iterator和Cells是Array中的嵌套类,该类在此代码中描述:

#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
#include "sort.h"
using namespace std;
//Array is array of T's (template objects)
template <class T>
class Array
{
private:
    //the array is consist cellss that holds the data
    template<class S>
    class Cell
    {
    public:
        //members:
        S* m_data;

        //methods:
        //C'tor:(inline)
        Cell(S* data=NULL): m_data(data){};
        //D'tor:(inline)
        ~Cell(){delete m_data;};
        //C.C'tor:(inlnie)
        Cell(const Cell<S>& cell):  m_data(cell.m_data){};
    };
public:
    //the Array may has an iterator:
    class Iterator
    {
    public:
        //members:
        Cell<T>* m_current;

        //default C'tor:(inline)
        Iterator(Cell<T>* ptr=NULL):m_current(ptr){};
        //C.C'tor:(inline)
        Iterator(const Iterator& itr2):m_current(itr2.m_current){};
        //D'tor:(inline)
        ~Iterator(){};

        //////Operators/////

        //assigment operator:
        Iterator& operator = (const Iterator& itr2){m_current=itr2.m_current;
        return *this;};

        //comparsion operators:
        bool operator == (const Iterator& itr2)const 
        {return (itr2.m_current==m_current);};
        bool operator != (const Iterator& itr2) const{return !(*this==itr2);};

        //reference operator:
        T& operator * ()const {return *(m_current->m_data);} ;

        //forward operators (++):
        Iterator& operator ++ () // prefix:  ++a
        {m_current=&(m_current[1]); 
        return *this;};  

        const Iterator operator ++ (int)// postfix:  a++
        {Iterator itr=*this;
        ++*this;
        return itr;};    

private:        
    //members of Array:
    Cell<T>* m_head,*m_last;
    unsigned int m_size;
public:
    /*******************C'tors and D'tors************************/
    //C'tor:(inline)
    Array():m_head(NULL),m_last(NULL), m_size(0){};
    //D'tor:
    ~Array(){delete[] m_head;};
    //C.C'tor:
    Array(const Array& array): m_head(array.m_head),m_last(array.m_last),m_size(array.m_size){};

    /****************Adding********************/
    //add an element to the end of the Array:
    void add(const T added);

    /*********************Iterate*****************************/
    //return an iterator to the start of the Array:
    Iterator begin()  const {return  Iterator(m_head); };
    //return an iterator to the element after the end of the Array:
    Iterator end() const{return  Iterator(&(m_last[1]));};


    /*****************************Operators********************************/
    //printing all the elements in the Array (with a specific format)
    template <typename G> friend std::ostream& operator << (ostream &os, const Array<G> &a);
};

现在我在尝试实施operator <<时遇到了问题 在Visual Studio 2012中尝试:

Array<int> a;
a.add(3);
cout<<a;

它的输出像往常一样是3,但在g ++中,编译器无法识别operator <<实现的第二行中的Iterator类。

以下是operator <<的实现代码(记住它是朋友功能)

template<class G>std::ostream& operator << (ostream &os,const  Array<G> &a)
{
    //crtating traversal and bound:
    Array<G>::Iterator itr=a.begin(),end=a.end();
    //traverse and print:
    while (itr!=end)
    {
        os<<*itr++;
        //last element should not print space!:
        if (itr!=end)
            cout<<" ";
    }
    return os;
}

我在这里失踪了什么?我需要在某处放置另一个template吗? 我得到的错误:

Array.h: In function 'std::ostream& operator<<(std::ostream&, const Array<G>&)':
Array.h:296: error: expected ';' before 'itr'

1 个答案:

答案 0 :(得分:4)

将通过更改行来修复:

Array<G>::Iterator itr=a.begin(),end=a.end();

为:

typename Array<G>::Iterator itr=a.begin(),end=a.end();

归功于Andy Prowl和Praetorian