为什么模板允许未完成的方法类型 类?
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 的完整定义之后,因此编译器可以毫无问题地找到它。
为什么模板能让您绕过不完整的类型? 我正在关注有关节点、链表和迭代器的教科书中的示例。我注意到他在迭代器 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 的完整定义之后,因此编译器可以毫无问题地找到它。