首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在赋值中将“clist<int>::node*”转换为“clist<char>::node*”

无法在赋值中将“clist<int>::node*”转换为“clist<char>::node*”
EN

Stack Overflow用户
提问于 2012-06-11 22:46:30
回答 2查看 772关注 0票数 0

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

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

代码语言:javascript
复制
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

有没有人能告诉我这里合适的选角方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-11 22:48:11

强制转换实际上使您不必创建异类列表。您似乎要做的是连接两个列表-一个使用int,另一个使用char。现在,从概念上讲,这似乎是合理的,但是int节点和char节点的结构差别太大了。

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

票数 1
EN

Stack Overflow用户

发布于 2012-06-11 22:49:10

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10982416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档