C++ 如何对多个函数或结构使用单个模板语句?

C++ 如何对多个函数或结构使用单个模板语句?,c++,templates,generic-programming,C++,Templates,Generic Programming,我一直试图将堆栈表示为一个模板,我使用了一个struct,一切都很好,但每次我想编写一个模板函数时,我都必须编写同一个模板语句,这似乎不正确——尽管可行- 那么如何为所有函数编写一个模板语句呢?下面是我的代码: template <typename T> struct Stack { T Value; Stack* next; }; template <typename T> void Push(T Value,Stack* &Top) { Stack * C

我一直试图将堆栈表示为一个模板,我使用了一个struct,一切都很好,但每次我想编写一个模板函数时,我都必须编写同一个模板语句,这似乎不正确——尽管可行-

那么如何为所有函数编写一个模板语句呢?下面是我的代码:

template <typename T> struct Stack { T Value; Stack* next; }; template <typename T> void Push(T Value,Stack* &Top) { Stack * Cell = new Stack(); Cell->Value = Value; Cell->next = Top; Top = Cell; }; template <typename T> bool IsEmpty(Stack * Top) { return (Top==0); } template <typename T> void Pop(T &Value,Stack* &Top) { if (IsEmpty(Top)) cout * Temp = Top; Value = Top->Value; Top = Top->next; delete Temp; } } template <typename T> void GetTop(T &Value, Stack* &Top) { if (IsEmpty(Top)) cout Value; } template <typename T> void EmptyStack(Stack * &Top) { Stack * Temp; while (!(IsEmpty(Top))) { Temp = Top; Top = Top->next; delete Temp; } } 模板<typename T> 结构堆栈 { T值; 堆栈*下一步; }; 模板<typename T> 无效推送(T值、堆栈*&顶部) { 堆栈*单元格=新堆栈(); 单元格->值=值; 单元格->下一步=顶部; 顶部=单元; }; 模板<typename T> 布尔值为空(堆栈*顶部) { 返回(Top==0); } 模板<typename T> 无效弹出(T值、堆栈*&顶部) { 如果(IsEmpty(顶部)) cout*Temp=顶部; 值=顶部->值; 顶部=顶部->下一步; 删除临时文件; } } 模板<typename T> void GetTop(T&值、堆栈*&顶部) { 如果(IsEmpty(顶部)) 库特值; } 模板<typename T> 空清空堆栈(堆栈*&顶部) { 堆栈*温度; 而(!(i空(顶))) { 温度=顶部; 顶部=顶部->下一步; 删除临时文件; } } 希望我的意思现在已经清楚了,很抱歉有个小问题:(


提前感谢。

您只需编写一个模板类,然后将所有这些函数作为该类的方法编写。然后它们将与该类共享相同的模板参数。

您只需编写一个模板类,然后将所有这些函数作为该类的方法编写。然后它们将共享相同的模板参数参数作为类。

如果(根据您的评论,情况似乎是这样)希望将它们作为自由函数,则不能。您还必须更改
堆栈
参数,如下所示:

template <typename T>
void Push(T Value, Stack<T>* &Top)
{
    Stack * Cell = new Stack();
    Cell->Value = Value;
    Cell->next = Top;
    Top = Cell;
};
在你真正做的事情上没有多大区别,但是当你把一些东西放在堆栈上时,分配
堆栈::节点
似乎(至少对我来说)比分配
堆栈
更有意义。包含多个节点的堆栈有意义——包含多个堆栈的堆栈真的没有意义。

如果(根据您的评论,情况似乎是这样)如果希望将它们作为自由函数,则不能。您还必须更改
Stack
参数,如下所示:

template <typename T>
void Push(T Value, Stack<T>* &Top)
{
    Stack * Cell = new Stack();
    Cell->Value = Value;
    Cell->next = Top;
    Top = Cell;
};

在你真正做的事情上并没有多大区别,但当你把一些东西放到堆栈上时,分配一个
stack::node
似乎(至少对我来说)比分配一个
堆栈
更有意义。一个包含多个节点的堆栈是有意义的——一个包含多个堆栈的堆栈实际上没有意义。

Hmm……你似乎对模板和对象有一个基本的误解。你在这里以非常C风格编写代码——而不是创建成员函数,y你正在创建自由函数,其中包含指向实例的指针。此外,这甚至不应该编译,因为如果没有模板参数,你不能声明
Stack*
。我清楚地理解模板和OOP,但我在下面对答案的评论中声明了我的理由,我在一个完全正常工作的程序中使用了这段代码,使用控制台应用程序嗯…你似乎对模板和对象有一个基本的误解。你在这里用一种非常C风格编写代码-而不是创建成员函数,而是创建自由函数,该函数带有一个指向实例的指针。此外,这甚至不应该编译,因为你不能声明
堆栈*
没有模板参数。我清楚地理解模板和OOP,但我在下面的答案评论中声明了我的理由,我在一个完全正常工作的程序中使用了这段代码,使用的是控制台应用程序。我确实这样做了,但实际上我正试图以两种方式表示堆栈。这是一个特殊的原因吗?是的,确实有写一个半讲座,读者还没有学会课程,所以我必须通过表示堆栈向他们展示模板的伟大用途,但没有OOP,我做到了,但实际上我正试图以两种方式表示堆栈有一个特殊的原因吗?是的,有,我实际上写了一个半讲座,读者还没有学会课程,所以我我要通过表示堆栈来向他们展示模板的伟大用途,但是如果没有OOP,我没有真正理解您对实际堆栈和节点所说的,您建议的设计是什么?为什么您需要一个指向堆栈指针的引用?为什么不只是
stack&s
?@Alex:既然您提到了,您可能不知道--我复制了它我不知道你说的关于实际堆栈和节点的什么,你建议的设计是什么?为什么你需要一个指向堆栈指针的引用?为什么不仅仅是
stack&s
?@Alex:既然你提到了,你可能不知道——我从他的代码中复制了那部分,但没有更新它。