#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...
(函数已声明)
答案 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 ++中不是必需的。