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

Why do templates allow for method types of unfinished classes?

为什么模板能让您绕过不完整的类型? 我正在关注有关节点、链表和迭代器的教科书中的示例。我注意到他在迭代器 class 中使用了指向列表和节点实例的指针,但随后他还在列表 class 中创建了一个方法 return 一个迭代器 class.当我尝试自己实现它以节省时间时,我没有将其模板化而是选择了 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;

};

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

Helper<Datatype> getHelper()

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

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

相同的技术适用于非模板情况。

更新 OP 后编辑: 在非模板 classes 中,要使用实际对象(而不只是指针),您需要有完整的 class 定义可用。所以前向声明是不够的,当你尝试 return Helper.

的实例时它会给你一个错误

模板在您使用它们之前不会被实例化,在您的情况下是在您提供了 Helper 的完整定义之后,因此编译器可以毫无问题地找到它。