0

ここでは、あるリストを別のリストの最後に連結するために使用されるcircular linked list ( template <class t> class clist; )メンバー関数を使用して を作成しています。concat ()問題はこの関数にあります。clist同じテンプレートパラメーターで2つを連結すると(両方とも )、関数は正常に機能しますが、2つ(and )をclist<int>連結しようとするとすぐに、関数でキャストを行う必要があります。テンプレートについては、実際にその方法を理解していません。clistsclist <int> c1clist <char> c2concat

したがって、問題は正確には、以下のプログラムの最後の 2 行目にあります。clist <int> c1メンバー関数がconcat呼び出され、clist <char> c2c1 の最後に連結されています。

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

0

テンプレート引数は共変でも反変でもありません。clist<int>全く違うタイプですclist<char>。それらの間で変換することはできません。型の定義はテンプレート型に含まれているため、テンプレート パラメータにも依存し、対応する型も同様に異なります。nodenode

各リストには、1 つのタイプのみを含めることができます。任意の型を含むことができるリストを作成しようとしている場合は、テンプレート引数にバリアント スタイルの型を使用する必要があります。

于 2012-06-11T14:49:10.360 に答える