如何返回指向模板结构的指针?

时间:2018-12-12 13:43:52

标签: c++ templates pointers struct

#include <iostream>
using namespace std;


template<class T>
class LinkedList
{
public:
    struct Node {
        T data;
        Node* link;
    };
    struct Node* getNode();
    LinkedList();
    ~LinkedList();
private:
    Node* head;
};

template<class T>
struct Node* LinkedList<T>::getNode() // Error
{
    return head;
}

template<class T>
LinkedList<T>::LinkedList()
{
    head = NULL;
}

template<class T>
LinkedList<T>::~LinkedList()
{
}

如您所见,我想创建一个可以接受任何数据类型的LinkedList类。我在返回指向模板结构的指针时遇到问题。

错误消息是declaration is incompatible with...(函数已声明)

1 个答案:

答案 0 :(得分:2)

template<class T>
struct Node* LinkedList<T>::getNode() // Error
{
    return head;
}

Node的范围为LinkedList<T>。由于您不在函数参数列表或函数主体之内,因此无法使用不合格的Node。您必须使用LinkedList<T>::Node来限定名称的范围,以告诉编译器您正在使用LinkedList<T>的{​​{1}}。由于Node是从属名称,因此您还需要使用关键字typename。这意味着您需要:

Node

或者您可以使用尾随返回类型并使用

template<class T>
typename LinkedList<T>::Node* LinkedList<T>::getNode()
{
    return head;
}

省去键入所有内容。


还请注意,使用template<class T> auto LinkedList<T>::getNode() -> Node* { return head; } 的名称时不需要使用struct。这在C中是必需的,但在C ++中不是必需的。