在c ++中 - h文件中的两个ifndef结构导致错误c2955使用类模板需要模板参数列表

时间:2014-03-30 23:40:16

标签: c++

我正在编译两个用于构造和测试模板化堆栈类的文件。 .h文件包含两个ifndef结构,一个用于节点结构,另一个用于堆栈类。单独的节点和堆栈ifndef是赋值的要求,如下所示:

  

将您的类命名为Stack,并编写其规范和函数   名为Stack.h的文件中的模板。使用动态数组或   链表实现类,并确保包含动态   内存管理。如果使用链接列表,请使用节点作为节点   struct name,并将其包含在Stack.h中,确保将其括起来   它自己的#ifndef NODE / #endif容器 - 会阻止编译器   稍后编写队列模板时出现问题。

我遇到或者至少在我遇到的问题中,问题是,当我去编译时,我得到错误c2955:'堆栈&# 39; :使用class tempate需要模板参数列表" (可能还有其他错误,但这是我觉得我需要先解决才能继续前进的主要错误)。这似乎是两个ifndefs之间的问题?我很感激任何人都能帮助我的帮助。

Stack.h

#ifndef Node
#define Node

template <class DataType>
struct Node
{
  DataType data;
  Node<DataType>* next;
};

#endif




#ifndef Stack_h
#define Stack_h

template <class DataType>
class Stack
{  
  private:
    Node<DataType>* start;
    Node<DataType>* end;


  public:
    // constructors (inline)
    Stack()
    :start(0)
    {

    }

    // getters (inline)
    bool isEmpty() const
    {
      return 0 == start;
    } // getter

    // setters
    /* push  */  void Stack<DataType>::push(const DataType& parameter);
    /* peek  */  bool Stack<DataType>::peek(DataType& parameter) const;
    /* pop   */  bool Stack<DataType>::pop(DataType& parameter);
    /* empty */  void Stack<DataType>::makeEmpty(  );




};

template <class DataType>
void Stack<DataType>::push(const DataType& parameter)
{
  Node<DataType>* node = new Node<DataType>;
  node->data = parameter;
  node->next = start;
  start = node;
}

template <class DataType>
bool Stack<DataType>::peek(DataType& parameter) const
{
  if (0 == start) return false; // failed
  parameter = start->data;
  return true; // success
}

template <class DataType>
bool Stack<DataType>::pop(DataType& parameter)
{
  if (0 == start) return false; // failed
  parameter = start->data;
  Node<DataType>* p = start->next;
  delete start;
  start = p;
  return true; // success
}

template <class DataType>
void Stack<DataType>::makeEmpty()
{
  Node<DataType>* p;
  while (start) 
  { 
    p = start->next; 
    delete start; 
    start = p;
  }
}


#endif

StackDriver.cpp

#include <iostream>

using namespace std;

#include "Stack.h"
#include "Stack.h" // testing ifndef


int main()
{


  cout << "Testing: creating a new int stack, adding one data value to it, then retrieving (via peep) that data" << endl << endl;

  cout << "Data to be added - 100, same data should be returned" << endl << endl;

  Stack aStack<int>;

  aStack.push( 100 );

  int dataReturn;

  aStack.peek( dataReturn );

  cout << "returned data is " << dataReturn << endl << endl;



}

2 个答案:

答案 0 :(得分:1)

这是一个问题:

#define Node

template <class DataType>
struct Node
{

第一行使Node的令牌替换被替换为任何内容。

因此,当编译器到达您以后的代码时,它只会看到:

template <class DataType>
struct
{

不能做你想做的事,导致你的错误。

要解决此问题,请正确使用包含警戒。每个头文件只使用一个保护。保护的目的是让编译器知道如果它已经读过那个头文件就不会读它。

我还建议在所有大写字母中使用名称,以便在文件中包含警卫和有效令牌之间不会发生冲突。头文件应如下所示:

// (First line of header)
#ifndef H_STACK
#define H_STACK

// all code goes here

#endif   // H_STACK
// (last line of header)

答案 1 :(得分:1)

错误

  

使用class tempate需要模板参数列表

表示您实际上在没有专门化的情况下尝试使用您的课程:

Stack aStack<int>;必须是Stack<int> aStack;