为什么模板会让您绕过不完整的类型? 我在关于节点,链接列表和迭代器的教科书中关注了一个例子。我注意到他在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()
当硬键入时,会导致类型不完整的错误。我想知道模板是如何解决这个问题的?我有一些想法,因为模板允许不同内存大小的类型,然后它不会处理该方法内存返回大小,直到编译时。我很好奇这是如何工作的,如果有人有答案我会很感激。
答案 0 :(得分:0)
前面发布的代码中的第1-3行 - 声明了所有类,因此编译器现在可以在看到完整定义之前解析这些实例的指针。
相同的技术适用于非模板案例。
更新OP后编辑: 在非模板类中,要使用实际对象(而不仅仅是指针),您需要提供完整的类定义。所以前向声明是不够的,当你试图返回一个Helper实例时它会给你一个错误。
在您使用模板之前不会对模板进行实例化,在您提供Helper的完整定义之后,模板就是如此,因此编译器在查找它时没有问题。