如何在C ++中使用带嵌套类的模板

时间:2015-08-07 00:09:02

标签: c++ templates nested-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);
    //....
}

请您告诉我如何实现上述目标?感谢。

1 个答案:

答案 0 :(得分:1)

Node是类模板的嵌套类型:

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::类型具有的typedef,以允许编写灵活的代码。

另外,请注意typename keyword - 如果是类模板的嵌套类型,则需要它。它表示,给定的名称是一个类型的名称(没有它,你应该得到编译器错误)。