简体   繁体   English

错误:'struct List'需要模板参数

[英]error: template argument required for 'struct List'

I'm trying to create my own template for a List class as a learning excercise. 我正在尝试为List类创建自己的模板作为学习练习。 I've been having some trouble with template syntax though and i'm now getting the following error message.. 我在模板语法方面遇到了一些问题,现在我收到以下错误消息..

main.cpp|Line 8|instantiated from here
error: template argument required for 'struct List'
In function 'int main()':
...

As far as i can tell i'm not misusing anything but this is my first time working with templates and would really appreciate someone looking through and letting me know what i'm doing wrong. 据我所知,我不会滥用任何东西,但这是我第一次使用模板,并且非常感谢有人翻阅并让我知道我做错了什么。

List.hpp: List.hpp:

#if !defined _LIST_HPP_
#define _LIST_HPP_

#include "Node.hpp"

///since we're creating a template everything must be defined in the hpp

template <typename ListType>
class List
{
   public:
      List();
      bool Empty();
      void PushFront();
      void PushBack();
      void PopBack();
      Node<ListType>& GetHead();

   private:
      int _size;
      Node<ListType>* _head;
      Node<ListType>* _tail;
};


///implement List class here
template <typename ListType>
List<ListType>::List() : _head(0), _tail(0), _size(0)
{
}
template <typename ListType>
bool List<ListType>::Empty()
{
   return _size == 0;
}
template <typename ListType>
void List<ListType>::PushFront()
{
   _head = new Node<ListType>( _head , 0 );
   if (!Empty())
      _head->_prev->_next = _head; //set previous nodes _next to new _head

   ++_size;
}
template <typename ListType>
void List<ListType>::PushBack()
{
   _tail = new Node<ListType>( 0 , _tail);
   if (!Empty())
      _tail->_next->_prev = _tail; // set old tails _prev to new tail

   ++_size;
}
template <typename ListType>
void List<ListType>::PopBack()
{

}
template <typename ListType>
Node<ListType>& List<ListType>::GetHead()
{
   return _head;
}

#endif //define

Node.hpp: Node.hpp:

#if !defined _NODE_HPP_
#define _NODE_HPP_


template<typename NodeType>
class Node{
   public:
      Node( Node* prev = 0, Node* next = 0);
      void SetData(NodeType newData);
      void GetData();
   private:
      friend class List;

      NodeType _data;
      Node* _next;
      Node* _prev;

};


///implement Node

template <typename NodeType>
Node<NodeType>::Node(Node* prev, Node* next) : _prev(prev), _next(next)
{}
template <typename NodeType>
void Node<NodeType>::SetData(NodeType newData)
{
   _data = newData;
}
template <typename NodeType>
void Node<NodeType>::GetData()
{
   return _data;
}

#endif //define

Main.hpp Main.hpp

#include <iostream>
#include "List.hpp"
int main()
{
   List<int> testl;
      //test
      testl.PushFront();
      testl.GetHead().SetData(7); //Error thrown here??
      std::cout << test1.GetHead().GetData() << std::endl;

   return 0;
}

List is a class template, so you need to declare it as such in your friend declaration List是一个类模板,因此您需要在您的朋友声明中声明它

template<typename ListType>
friend class List;

If you only want List<NodeType> to be a friend, you need to tell it that template argument, so then the friend declaration becomes 如果您只希望List<NodeType>成为朋友,则需要告诉它该模板参数,然后友元声明变为

friend class List<NodeType>;

For this to work, it needs to know that List exists as a class template, so you need to forward-declare it at the top of Node.hpp : 为此,它需要知道List作为类模板存在,因此您需要在Node.hpp的顶部向前声明它:

template<typename ListType>
class List;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM