为什么模板允许未完成类的方法类型?

时间:2015-02-06 10:25:38

标签: c++ templates class-method incomplete-type

为什么模板会让您绕过不完整的类型? 我在关于节点,链接列表和迭代器的教科书中关注了一个例子。我注意到他在Iterator类中使用了指向Lists和Nodes实例的指针,但是他还在List类中创建了一个方法来返回该类的Iterator。当我试图自己实现它以节省时间时,我没有模板化而是选择了int数据,但是我的Iterator类型方法会出现类型不完整的错误。当我按照模板表示法时,它工作正常。

template<class Datatype> class Object;    
template<class Datatype> class List;
template<class Datatype> class Helper;

template <class Datatype>
class Object {
public:
    Object() : m_data(), next(0) {}
    Datatype m_data;
    Object<Datatype>* next;
};

template <class Datatype>
class List{
public:
    List() : m_head(0), m_tail(0) {}
    Object<Datatype>* m_head;
    Object<Datatype>* m_tail;
    int m_count;
    Helper<Datatype> getHelper()
    {
        return Helper<Datatype>( m_head, this);
    }
};
template <class Datatype>
class Helper {
public:
    Helper( Object<Datatype>* p_node, List<Datatype>* p_list);
    Object<Datatype>* m_node;
    List<Datatype>* m_list;

};

编辑:我的问题所指的可能存在一些混淆。它指的是类型方法

Helper<Datatype> getHelper()

当硬键入时,会导致类型不完整的错误。我想知道模板是如何解决这个问题的?我有一些想法,因为模板允许不同内存大小的类型,然后它不会处理该方法内存返回大小,直到编译时。我很好奇这是如何工作的,如果有人有答案我会很感激。

1 个答案:

答案 0 :(得分:0)

前面发布的代码中的第1-3行 - 声明了所有类,因此编译器现在可以在看到完整定义之前解析这些实例的指针。

相同的技术适用于非模板案例。

更新OP后编辑: 在非模板类中,要使用实际对象(而不仅仅是指针),您需要提供完整的类定义。所以前向声明是不够的,当你试图返回一个Helper实例时它会给你一个错误。

在您使用模板之前不会对模板进行实例化,在您提供Helper的完整定义之后,模板就是如此,因此编译器在查找它时没有问题。