模板类/结构组合的好方法

时间:2014-11-12 03:01:14

标签: c++ class templates struct

什么是模板调用类需要调用模板化结构的最有效方法。这是带模板的经典有序列表问题。我的整个有序列表现在起作用(当我手动更改类型时)。但是,我不确定如何模板化对象(结构和类)。

基本上,这就是我的代码的结构:

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;清除这些错误的最有效方法是什么?当这个功能被注释掉时,代码可以很好地工作。

2 个答案:

答案 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来指示NodeQList<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_intNode_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:
};