错误:'struct List'所需的模板参数 [英] error: template argument required for 'struct List'

查看:207
本文介绍了错误:'struct List'所需的模板参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为List类创建我自己的模板作为学习锻炼。我一直有一些麻烦模板语法虽然,我现在得到以下错误信息..

I'm trying to create my own template for a List class as a learning excercise. 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:

#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

#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;
}


推荐答案

template<typename ListType>
friend class List;



如果您只需要 List< NodeType> 作为朋友,你需要告诉它模板参数,那么朋友声明成为

If you only want List<NodeType> to be a friend, you need to tell it that template argument, so then the friend declaration becomes

friend class List<NodeType>;

为了这个工作,它需要知道列表作为类模板存在,因此您需要在 Node.hpp 的顶部转发声明它:

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:

template<typename ListType>
class List;

这篇关于错误:'struct List'所需的模板参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆