0

在这里,我正在制作一个circular linked list ( template <class t> class clist; )成员函数,concat ()用于将一个列表连接到另一个列表的末尾。问题出在这个函数上。现在,当我clist用相同的模板参数连接两个(假设两者都是clist<int>)时,函数可以正常工作,但是一旦我尝试连接两个clistsclist <int> c1clist <char> c2),那么我需要在函数中进行一些转换concat,因为我不太了解关于模板,我真的不知道该怎么做。

所以问题恰恰出在下面程序的最后第二行。我有clist <int> c1它的成员函数concat被调用,并且clist <char> c2在 c1 的末尾被连接起来。

template <class t>
class clist
{
    struct node
    {
    t data;
    node* next;
    node (const t& x=0, node* nxt=0): data(x), next(nxt) { }
    };

    typedef node* NPTR;

    public:

    NPTR ptr;

    template <class r>
    void concat ( clist <r> & );

    // other functions like push, pop etc. to form the clist

    clist () : ptr(0) { }
};

template <class t>
template <class r>
void clist<t> :: concat ( clist <r>& c2 )
{
    // ptr is pointer to a certain node in the list through which the list is
    // accessedand is zero initially.

    if ( c2.ptr == 0 ) return;
    if ( ptr == 0 ) ptr = (NPTR) c2.ptr;
    else
    {
    NPTR p = ptr->next;
    ptr->next = (NPTR) c2.ptr->next;
    c2.ptr->next = ( ??? ) p ;
    ptr = (NPTR)c2.ptr;
}

无论我尝试什么,它仍然显示错误cannot convert 'clist<int>::node*' to 'clist<char>::node*' in assignment

有人可以告诉这里什么是正确的投射方式吗?

4

2 回答 2

1

演员阵容实际上使您免于制作异类列表。您似乎想要做的是连接两个列表 - 一个与 int 和一个与 char。现在从概念上讲,这似乎是合理的,但是 int 节点和 char 节点的结构太不同了。

唯一有意义的方法是将第二个列表复制到一个整数列表中,然后连接起来。

于 2012-06-11T14:48:10.890 回答
0

模板参数既不是协变的也不是逆变的;clist<int>并且clist<char>完全不同的类型。您无法在它们之间进行转换。由于node类型的定义包含在模板类型中,它也依赖于模板参数,对应的node类型也同样不同。

每个列表只能包含一种类型。如果您尝试编写一个可以包含任何类型的列表,则需要为模板参数使用变体样式类型。

于 2012-06-11T14:49:10.360 回答