我正在编译两个用于构造和测试模板化堆栈类的文件。 .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;
}
答案 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;
。