1

我试图实现一个持久的双端队列结构。但我对 C++ 中的模板不是很熟悉。现在只有一个push_front函数,它不能正确编译。

#include <iostream>

using namespace std;

template < typename T > class Container{
public:
    T val;
    Container(){}
    Container(T _val){
        val = _val;
    }
};

template < typename T > class Deque{
public:
    Container<T>* head;
    Container<T>* tail;
    Deque< pair<T, T> > *child;
    Deque<T>(){}
    Deque<T>(Container<T>* _head, Deque< pair<T, T> > *_child, Container<T>* _tail){
        head = _head;
        child = _child;
        tail = _tail;
    }
    Deque<T>* push_front(T x){
        if (this == NULL)
            return new Deque<T>(new Container<T>(x), NULL, NULL);
        if (head == NULL)
            return new Deque<T>(new Container<T>(x), child, tail);
        return new Deque<T>(NULL, child->push_front(make_pair(x, head->val)), tail);
    }
};

int main(){
    Deque<int> d;
    int a = 1;
    d.push_front(a);
}

有 push_front 函数的算法方案。 http://i.stack.imgur.com/an1xd.jpg

4

2 回答 2

3

我相信编译器可能会被这样一个事实混淆,即Deque<int>具有一个childof 类型Deque<pair<int,int>>*,该child类型Deque<pair<pair<int, int>, pair<int, int> > >*具有一个具有...... ad infinitum 的孩子的类型,并尝试实例化所有这些类型。

Deque<int>
    child: Deque<pair<int, int> >*
        child: Deque<pair<pair<int, int> , pair<int, int> > >*
            child: Deque<pair<pair<pair<int, int>....
于 2013-04-10T07:56:35.087 回答
0

您有一个递归实例化:

dt.cpp: In instantiation of 'Deque<T>::Deque(Container<T>*, Deque<std::pair<T, T> >*,
Container<T>*) [with T = std::pair<std::pair<std::pair<int, int>, std::pair<int, int> >,
std::pair<std::pair<int, int>, std::pair<int, int> > >]':
dt.cpp:38:83:   recursively required from 'Deque<T>* Deque<T>::push_front(T) [with T = 
std::pair<int, int>]' 

等等。如果您对 进行一些小的修改Dequeg++将开始吐出这些错误:

Deque<T>(Container<T>* head_, Deque< pair<T, T> > *child_, Container<T>* tail_)
  : head(head_), child(child_), tail(tail_)
{ }

Deque<T>* push_front(T x)
{
    if (head == NULL)
        return new Deque<T>(new Container<T>(x), child, tail);
    return new Deque<T>(NULL, child->push_front(make_pair(x, head->val)), tail);
}
于 2013-04-10T08:02:08.413 回答