在这里,我使用成员函数制作了一个circular linked list ( template <class t> class clist; )
,concat ()
用于将一个列表连接到另一个列表的末尾。问题在于此功能。现在,当我使用相同的模板参数将两个clist
串联时(假设两个都是clist<int>
),则函数可以正常工作,但是当我尝试将两个clists
(clist <int> c1
和clist <char> c2
)串联时,需要在函数concat
中进行一些强制转换,并且由于我对模板了解不多,所以我实际上想出了如何做到这一点。
因此问题恰恰在于下面程序的第二行。我有被调用其成员函数clist <int> c1
的concat
和正在连接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列表中,然后进行串联。