模板化调用需要调用模板化结构的类的最有效方法是什么。这是模板的经典有序列表问题。我的整个有序列表现在有效(当我只是手动更改类型时)。但是,我不确定如何对这对对象(结构和类)进行模板化。
基本上,我的代码结构如下:
struct Node {
int* data;
Node* next;
};
class OList {
private:
Node* start;
int size;
public:
a bunch of manipulation functions
};
所以,我的愿望是简单地模板化结构,然后接受一个参数,该参数将模板传递给 Node 结构类型。然而,我的第一次尝试是:
template<class T>
在 Node 结构之前并将所有 ints*
更改为 T*
惨遭失败。根据任何人的经验,什么可能是更好的方法?任何人都可以指出我正确的方向或给我一些模板基础知识的良好引用吗?我所能找到的都是具体问题,这些问题并没有让我对模板的工作原理有一个很好的了解。
更新:此时我的代码运行良好。我仍然不明白的唯一一件事是如何在函数中返回 Node 结构的指针。例如,在一个可能的函数中,
template <class T>
List<T>::Node<T>* List<T>pos(int val); //trying to return a pointer to the node at a specified spot
我得到以下错误:“非模板化的‘节点’用作模板。注意:使用 OList::template Node’来指示它是一个模板(???)错误:在‘OList 之前需要‘typename’::Node' 因为 'OList 是一个依赖范围' 清除这些错误的最有效方法是什么?当注释掉这个函数时,代码可以完美运行。
最佳答案
template <typename T> // <----
struct Node {
T* data; // <----
Node* next;
};
template <typename T> // <----
class OList {
private:
Node<T>* start; // <----
int size;
public:
a bunch of manipulation functions
};
或者……
template <typename T>
class OList {
private:
typedef ::Node<T> Node; // <---- just do it once
Node* start;
...或按照 BWG 评论中的建议,定义 Node
直接在OList
, 所以所有的 <T>
方面是隐含的...
template <typename T>
class OList {
private:
struct Node { T* data; int size; }; // <----
Node* start;
外联成员函数定义示例:
template <typename T>
class OList
{
private:
struct Node { T* data; };
Node* f(Node*);
public:
};
template <typename T>
typename OList<T>::Node* OList<T>::f(typename OList<T>::Node* p) // see notes
{
Node* p2 = p; // can use Node as if inside class definition
return p2;
}
注意丑陋的线条......
typename OList<T>::Node* OList<T>::f(typename OList<T>::Node* p)
...哪里typename
需要表明 Node
在 QList<T>
中命名一个类型(因此它可以做更多的事情来确保该函数甚至在为任何特定类型“T”实例化之前就有意义),我们需要不断提及这两个 Node
在里面QList
的范围,以及 QList
的具体实例化在其中找到它是基于模板参数 T
.这一切都说得通,但有点迂腐。
至于模板一般是如何工作的,对于 Stack Overflow 上的答案来说,这可以说是“过于宽泛”,但 FWIW 可能是快速启动一些实际理解的最快方法(之后需要一些改进),是通过比较他们到宏。考虑:
#define NODE(T) \
struct Node ## T { \
T* data; \
Node ## T* next; \
};
有了这个,你可以说 NODE(int)
或 NODE(float)
生成 Node_int
和 Node_float
这些类型的结构。使用模板,您(通常)不需要单独定义每个特化 - 它在使用时隐式完成(“参数多态性”) - 所以只需开始将它们用于变量 ala Node<int> my_node_for_ints
.
关于c++ - 模板类/结构组合的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26878519/