在这里,我使用成员函数制作了一个circular linked list ( template <class t> class clist; )concat ()用于将一个列表连接到另一个列表的末尾。问题在于此功能。现在,当我使用相同的模板参数将两个clist串联时(假设两个都是clist<int>),则函数可以正常工作,但是当我尝试将两个clistsclist <int> c1clist <char> c2)串联时,需要在函数concat中进行一些强制转换,并且由于我对模板了解不多,所以我实际上想出了如何做到这一点。

因此问题恰恰在于下面程序的第二行。我有被调用其成员函数clist <int> c1concat和正在连接c1末尾的clist <char> c2

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

有人可以告诉我在这里进行投射的正确方法是什么吗?

最佳答案

强制转换实际上使您免于创建异类列表。您似乎想做的是将两个列表连接在一起-一个列表为int,另一个列表为char。现在从概念上看这似乎是合理的,但是int节点和char节点的结构太不同了。

唯一有意义的方法是,如果将第二个列表复制到一个cint列表中,然后进行串联。

08-16 20:12