在这里,我使用一个成员函数concat ()创建一个circular linked list ( template <class t> class clist; ),用于将一个列表连接到另一个列表的末尾。问题出在这个函数中。现在,当我用相同的模板参数连接两个clist (假设两者都是clist<int>)时,函数可以正常工作,但只要我尝试连接两个clists ( clist <int> c1和clist <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。
有没有人能告诉我这里合适的选角方式是什么?
发布于 2012-06-11 22:48:11
强制转换实际上使您不必创建异类列表。您似乎要做的是连接两个列表-一个使用int,另一个使用char。现在,从概念上讲,这似乎是合理的,但是int节点和char节点的结构差别太大了。
唯一有意义的方法是将第二个列表复制到整数的clist中,然后连接起来。
发布于 2012-06-11 22:49:10
模板参数既不是协变的,也不是逆变的;clist<int>和clist<char>是完全不同的类型。您无法在它们之间进行转换。由于node类型的定义包含在模板类型中,因此它也依赖于模板参数,相应的node类型也有类似的不同。
每个列表只能包含一种类型。如果您正在尝试编写一个可以包含任何类型的列表,则需要为模板参数使用变体样式的类型。
https://stackoverflow.com/questions/10982416
复制相似问题