什么是模板调用类需要调用模板化结构的最有效方法。这是带模板的经典有序列表问题。我的整个有序列表现在起作用(当我手动更改类型时)。但是,我不确定如何模板化对象(结构和类)。
基本上,这就是我的代码的结构:
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
我收到以下错误:&#34;非模板化节点&#39;用作模板。注意:使用OList :: template Node&#39;表明它是一个模板(???)错误:需要&#39; typename&#39;之前&#39; OList :: Node&#39;因为&#39; OList是一个依赖范围&#34;清除这些错误的最有效方法是什么?当这个功能被注释掉时,代码可以很好地工作。
答案 0 :(得分:2)
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>
内命名一个类型(因此它可以做更多的事情以确保该功能在它之前可能有意义#39; s针对任何特定类型&#39; T&#39;)实例化,我们需要不断提及Node
范围内QList
的内容,并且找到它的QList
的特定实例化基于模板参数T
。这一切都有道理,但它有点迂腐。
至于模板如何工作,这可以说是太宽泛了#34;关于Stack Overflow的答案,但FWIW可能是最快的方式来启动一些实际的理解(之后需要进行一些改进),通过将它们与宏进行比较。考虑:
#define NODE(T) \
struct Node ## T { \
T* data; \
Node ## T* next; \
};
有了这个,您可以说NODE(int)
或NODE(float)
为这些类型生成Node_int
和Node_float
结构。使用模板,您(通常)不需要单独定义每个专业化 - 使用时隐式完成(&#34;参数多态&#34; ) - 所以才开始将它们用于变量ala Node<int> my_node_for_ints
。
答案 1 :(得分:0)
你的意思是:
template <typename T>
struct Node {
T data;
Node* next;
};
template <typename T>
class OList {
private:
Node<T> start;
int size;
public:
};