c++ - g++ 编译器不识别嵌套模板类

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

<分区>

我有一个模板数组类,该数组在内存中有连续数量的单元格。该数组还有一个迭代器=>迭代器和单元格是数组中的嵌套类,该类在这段代码中描述:

#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'

最佳答案

将通过更改行来修复:

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

到:

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

归功于 Andy Prowl 和 Praetorian

关于c++ - g++ 编译器不识别嵌套模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16968958/

相关文章:

c++ - 创建非常大的动态数组

c++ - 为什么在 C++ 中不允许额外的方法限定?

python - Django 模板和应用程序未加载

c++ - 为什么在右值的情况下转发引用不推导出右值引用?

gcc - gcc和clang在编译时给我一个错误

c++ - 使用 boost::string_ref 进行字符串迭代的 int to small

c++ - 从基类继承,仅具有纯虚函数

templates - 角度 cli Hook

在 Docker Alpine 中编译 NSS 模块 - fatal error : nss. h:没有这样的文件或目录

c - C 中的嵌套结构访问