如何在 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 模板的嵌套类型的情况下需要它。它表明,给定的名称是一个类型的名称(没有它,你应该得到一个编译器错误)。