如何在 C++ 中使用带有嵌套 class 的模板
How to use templates with Nested class in C++
我正在尝试使用嵌套 class 的模板。我不确定如何从另一个 class.
访问内部 class 的 class 类型
下面的示例代码。
// I have a List class that can accept any type. It has an inner class
template <class T>
class List
{
public:
class Node
{
public:
T data;
Node* next;
Node* prev;
};
void addElement(Node& value);
private:
Node* head;
};
// Here I am making an array of Lists
template <class T>
class ListArray
{
public:
// Here is my question.
void add(Node& value); // How to give "Node" class type here ?
private:
List<T> _listArr[10];
};
// Is the below the right way to define ListArray::add, especially the way in which Node type can be passed to it ?
template <class T>
void ListArray<T>::add(List<T>::Node& value)
{
// Make a call to List::addElement and pass Node& value
_listArr[0].addElement(value);
//....
}
能否请您告诉我如何实现上述目标?谢谢
Node
是 class 模板的嵌套类型:
template <class T>
class ListArray
{
public:
typedef typename List<T>::Node Node_type;
void add(Node_type& value); // Refer to it as Node_type
private:
List<T> _listArr[10];
};
并且:
template <class T>
void ListArray<T>::add(typename ListArray<T>::Node_type& value)
{
_listArr[0].addElement(value);
//....
}
我使用 typedef
来定义节点类型的本地名称。它非常有用 - 现在,ListArray
的客户可以编写明确使用 Node_type
的代码(不知道它实际上是什么)。此技术在 std
库中大量使用 - 通常,std::
类型具有 吨 类型定义以允许编写灵活的代码。
另外,请注意 typename
keyword - 在 class 模板的嵌套类型的情况下需要它。它表明,给定的名称是一个类型的名称(没有它,你应该得到一个编译器错误)。
我正在尝试使用嵌套 class 的模板。我不确定如何从另一个 class.
访问内部 class 的 class 类型下面的示例代码。
// I have a List class that can accept any type. It has an inner class
template <class T>
class List
{
public:
class Node
{
public:
T data;
Node* next;
Node* prev;
};
void addElement(Node& value);
private:
Node* head;
};
// Here I am making an array of Lists
template <class T>
class ListArray
{
public:
// Here is my question.
void add(Node& value); // How to give "Node" class type here ?
private:
List<T> _listArr[10];
};
// Is the below the right way to define ListArray::add, especially the way in which Node type can be passed to it ?
template <class T>
void ListArray<T>::add(List<T>::Node& value)
{
// Make a call to List::addElement and pass Node& value
_listArr[0].addElement(value);
//....
}
能否请您告诉我如何实现上述目标?谢谢
Node
是 class 模板的嵌套类型:
template <class T>
class ListArray
{
public:
typedef typename List<T>::Node Node_type;
void add(Node_type& value); // Refer to it as Node_type
private:
List<T> _listArr[10];
};
并且:
template <class T>
void ListArray<T>::add(typename ListArray<T>::Node_type& value)
{
_listArr[0].addElement(value);
//....
}
我使用 typedef
来定义节点类型的本地名称。它非常有用 - 现在,ListArray
的客户可以编写明确使用 Node_type
的代码(不知道它实际上是什么)。此技术在 std
库中大量使用 - 通常,std::
类型具有 吨 类型定义以允许编写灵活的代码。
另外,请注意 typename
keyword - 在 class 模板的嵌套类型的情况下需要它。它表明,给定的名称是一个类型的名称(没有它,你应该得到一个编译器错误)。