为什么我得到一个不完整的类型错误以及如何解决它?

时间:2016-06-13 16:20:06

标签: c++ incomplete-type

这是一个现在得到的代码但由于不完整的变量类型container :: iterator错误而无法编译。这个类和迭代器仍然非常简单,因为我试图弄清楚如何组织我的代码。

template <typename T> class container {
    using size_type = std::size_t;
    using pointer           = T*;
    using const_pointer     = const T*;
public:
    class iterator;
    container (size_type n=0):  data {n>0 ? new T[n]:nullptr}, size {n>0 ? n:0}{};
    container (iterator begin, iterator end){};
    ~container (){ delete[] data; };
private:
    pointer     data;
    size_type   size;
};

template <typename T> class container<T>::iterator {
public:
    iterator (pointer p): current {p} {};
    iterator& operator++ (){ current++; return *this; };
    iterator& operator-- (){ current--; return *this; };
    reference operator* (){ return *current; };
    bool operator== (const iterator& b) const { return current == b.current; };
    bool operator!= (const iterator& b) const { return current != b.current; };
private:
    pointer current;
};

如果可能的话,我想将迭代器定义保留在容器类之外。谢谢你的回复。

2 个答案:

答案 0 :(得分:2)

  

如果可能的话,我想将迭代器定义保留在容器类之外。

事实并非如此,因为container的成员函数的参数在没有其类型定义的情况下无法正确分析。

将其内联移动。

答案 1 :(得分:2)

container (iterator begin, iterator end){};

使用iterator但在代码中的那一点上没有iterator的定义,只有声明。在甚至可以声明这个构造函数之前,您需要定义迭代器的结构。

可以更改此构造函数以获取引用。然后你可以在你的类中声明它,然后在iterator的定义下面定义它。 IMO这不是最好的方式,但它是可能的。