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

in two ifndef structures in an h file leading to error c2955 use of class template requires template argument list

本文关键字:错误 c2955 列表 参数 结构 文件 一个 ifndef 两个      更新时间:2023-10-16

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

将你的类命名为Stack,并编写它的规范和函数模板在名为Stack.h的文件中。使用动态数组或链表来实现类,并确保包含动态内存管理。如果使用链表,则使用Node作为节点结构名,并将其包含在Stack.h中,并确保将其包含在它自己的#ifndef NODE/#endif容器——这将阻止编译器以后编写队列模板时的问题。

我遇到的问题,或者至少,在我遇到的问题中,是当我去编译时,我得到"错误c2955: '堆栈':使用类模板需要模板参数列表"(可能还有其他错误,但这是主要的一个我觉得我需要在我可以前进之前解决)。这看起来像是两家公司之间的问题。我很感激任何人能给我的帮助。

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;

}

错误

使用类模板需要模板参数列表

表示您实际尝试使用您的类而没有对其进行专门化:

Stack aStack<int>;必须改为Stack<int> aStack;

这是一个问题:

#define Node
template <class DataType>
struct Node
{

第一行将Node替换为空。

所以当编译器到达你后面的代码时它只看到:

template <class DataType>
struct
{

,它不做你想做的,并导致你的错误。

要解决这个问题,请正确使用include保护符。每个头文件只使用一个保护。保护的目的是让编译器知道,如果已经读取了头文件,就不读取它。

我还建议使用全大写的名称,这样就不会在包含保护和文件中的有效令牌之间发生冲突。头文件应该看起来像:

// (First line of header)
#ifndef H_STACK
#define H_STACK
// all code goes here
#endif   // H_STACK
// (last line of header)