2015-11-27 177 views
3

我遇到了以下错误 - 当我只是先提供类的定义,然后再声明它。我的理解是,只要我们这样做,因为我已经做了很多次函数定义,编译器得到它,但似乎我的理解是有缺陷的,有人可以帮助我理解理解如何声明类的缺失部分。错误C2027:使用未定义的类型 - 如何声明类

error C2027: use of undefined type 'generic_iterator' 
note: see declaration of 'generic_iterator 

不工作 - 上述

#include <iostream> 
class generic_iterator; 
class darray 
{ 
public: 
    typedef generic_iterator iterator; 
    darray(); 
    darray(int size); 
    ~darray(); 
    int& at(int index); 
    int& operator [](int i); 
    int* data(void); 
    bool empty(); 
    void fill(int val); 
    void print(); 
    size_t max_size(); 
    iterator begin() {return iterator(ptrarray); } 
    iterator end() { return iterator(ptrarray + size); } 

private: 
    int *ptrarray; 
    int num_elements; 
    int size; 
}; 

class generic_iterator 
{ 
public: 
    generic_iterator(int *ptr); 
    ~generic_iterator(); 
    generic_iterator& operator++();  // pre-increment 
    generic_iterator operator++(int); // post-increment 
private: 
    int *iptr; 
}; 

作品显示错误:当整个类被声明为第一

class generic_iterator 
{ 
public: 
    generic_iterator(int *ptr); 
    ~generic_iterator(); 
    generic_iterator& operator++();  // pre-increment 
    generic_iterator operator++(int); // post-increment 
private: 
    int *iptr; 
}; 

class darray 
{ 
public: 
    typedef generic_iterator iterator; 
    darray(); 
    darray(int size); 
    ~darray(); 
    int& at(int index); 
    int& operator [](int i); 
    int* data(void); 
    bool empty(); 
    void fill(int val); 
    void print(); 
    size_t max_size(); 
    iterator begin() {return iterator(ptrarray); } 
    iterator end() { return iterator(ptrarray + size); } 

private: 
    int *ptrarray; 
    int num_elements; 
    int size; 
}; 

回答

2

当你在使用它之前声明一个东西的摘要,这就是所谓的声明

向一个函数进行前向声明时,编译器具有它需要的所有东西来解析调用该函数的代码:函数的名称,返回的类型,参数的数量以及每个参数的类型。

但是,当向一个类进行前向声明时,编译器只知道这个特定的符号(在你的情况下是generic_iterator)是一个类。随后,在完全定义它之前,你可以用它做的唯一事情就是声明一个指针。 (和我有更多C++知识的人可能会知道一两个额外的奥术用途。)你不能调用它的任何成员,因为编译器还不知道它的结构。你的代码试图调用你的前向引用类的构造函数,但编译器还不知道任何这样的构造函数。

我不知道任何简单的方法来解决这个问题。其他人可能有一些更好的解决方案,但我倾向于解决此问题的方式是将需要访问前向声明类的成员的所有代码从.h文件移动到.cpp文件。所以,在你的情况下,在.h文件中,我只会写iterator begin();,然后在.cpp文件中,我会写generic_iterator darray::begin() {return iterator(ptrarray); }

这会编译,因为那时候已知完整的类定义generic_iterator

+0

谢谢你的回答和纠正我的行话 - 那么工作方式只是方法来解决错误 - 或者在这种情况下还有其他方式来声明前向声明? – ifelse

+0

@ifelse我修改了我的答案。 –

+1

啊哈!我现在通常使用.cpp声明,这次我声明它是内联的,而且我遇到了错误。我想现在我更好了..感谢很多! – ifelse

3

编译器需要知道类的定义generic_iterator这是解析这些函数定义

iterator begin() {return iterator(ptrarray); } 
iterator end() { return iterator(ptrarray + size); } 

否则无法确定此代码是否正确,即类generic_iterator是否具有可用一个参数调用的构造函数。

考虑到将常数下标运算符与非常数运算符一起声明是正确的。例如

int& operator [](int i); 
const int& operator [](int i) const; 

int& operator [](int i); 
int operator [](int i) const; 

也尝试使用预选赛const与成员函数不改变物体本身例如像emptymax_size也许print

bool empty() const; 
void print() const; 
size_t max_size()const; 
+0

感谢关于类的其他功能的指针 - 所以我已经显示的片段的工作方式,这将是唯一的方式来声明类,即在其他类中使用它之前完全定义它 - 或我需要牢记一些其他形式的前瞻性声明? – ifelse

+0

@ifelse您可以在迭代器的类定义之后,在类定义之外定义这些函数(它们将只在类定义中声明)。 –

+0

明白了 - 谢谢! – ifelse

相关问题