2016-09-27 8 views
-1

テンプレート関数 s.t.を使用している間にリンクされたリストについていくつかの機能を実行しました。 intとstringの両方の好きなリストを扱うことができます。 指定した場所(ex 0,5)に値を挿入する場合は、値0の0番目の位置に挿入します。 val_transportを使用して、リンクリストに挿入する値とテンプレート関数のT * headを渡す頭から指定した値を挿入したい場所の直前のノードまで。テンプレートタイプ変換エラーでリンクされたリスト

int add_pos, add_int; 
string add_str; 
void main_function_insert_at() 
{ 

    cout << "Enter the position you want to addnode and its value :"; 
    if (type) 
    { 
     node < int> val_transport; 
     cin >> add_pos >> add_int; 
     val_transport.value = add_int; 
     int_head = insert_at(int_head, add_pos, val_transport); 
    } 
    else 
    { 
     node <string> val_transport; 
     cin >> add_pos >> add_str; 
     val_transport.value = add_str; 
     str_head = insert_at(str_head, add_pos, val_transport); 
    } 
} 

template < typename T > 
T* insert_at(T* head, int pos, T val_transport) 
{ 
    T* cur = head; 
    for (int i = 0; i < pos - 1; i++) 
    { 
     cur = cur->next; 
    } 
    if (type) 
    { 
     node <int>*newnode=NULL; 
     newnode = new node <int> ; 
     newnode->value = val_transport.value; 
     cur->next = newnode; 
     newnode->next = cur->next->next; 
    } 
    else 
    { 
     node <string>*newnode=NULL; 
     newnode = new node <string> ; 
     newnode->value = val_transport.value; 
     cur->next = newnode; 
     newnode->next = cur->next->next; 
    } 


} 

しかし、私のテンプレート機能では、 のようなエラーが、このような

エラー4エラーC2440としてラインで何度も何度も示しておくです:「=」:「にノード*」から変換することはできません'ノード*'から 'ノード*'に変換できません。 エラー6エラーC2440: '=': 'ノード*'から 'ノード*'に変換できません
エラー3エラーC2440: '=': 'ノード*'から 'ノード*'に変換できません
エラー7エラーC2440: '=': 'ノード*'から 'ノード*'に変換できません
エラー5エラーC2440: '=':f rom 'std :: string' to 'int'

これらは同じ問題のようです。

私はテンプレートがintとstringのような他の型を受け入れることができると思います。 しかし明らかに、私は間違っています。 誰かがそのアイデアを持っていますか?おかげで私は台湾CSにしてから新しいですので、私の悪い英語のための

**申し訳ありませんがたくさん:P

+0

はSOへようこそ。 [ask]を見てください。 [mcve]を投稿するのが最善です。 –

+0

実行時にリストのタイプを選択することはできません。 – molbdnilo

+0

@molbdnilo私は、演算子オーバーロードを試してみましたが、また失敗し、他のオプションが存在しません、ありがとう:D – Alfons

答えて

0

テンプレートは、コンパイル時にインスタンス化されます。

あなたが持っていると仮定すると

node<int>* int_head; 
node<string>* str_head; 
あなたは string挿入した場合、あなたのテンプレートがこれにインスタンス化します

:あなたが見ることができるように

node<string>* insert_at(node<string>* head, int pos, node<string> val_transport) 
{ 
    node<string>* cur = head; 
    for (int i = 0; i < pos - 1; i++) 
    { 
     cur = cur->next; 
    } 
    if (type) 
    { 
     node <int>*newnode=NULL; 
     newnode = new node <int> ; 
     newnode->value = val_transport.value; 
     cur->next = newnode; 
     newnode->next = cur->next->next; 
    } 
    else 
    { 
     node <string>*newnode=NULL; 
     newnode = new node <string> ; 
     newnode->value = val_transport.value; 
     cur->next = newnode; 
     newnode->next = cur->next->next; 
    } 
} 

は、「真」の分岐が間違っているノードを作成しますタイプ。

あなたが作成することになっているノードの種類をチェックする必要はありません - それはテンプレートパラメータ、Tと同じ型です:

template <typename T> 
T* insert_at(T* head, int pos, T val_transport) 
{ 
    T* cur = head; 
    for (int i = 0; i < pos - 1; i++) 
    { 
     cur = cur->next; 
    } 
    T *newnode = new T; 
    newnode->value = val_transport.value; 
    newnode->next = cur->next; 
    cur->next = newnode; 
    return head; 
} 

あなたはまた、タイプに基づいてテンプレートを作成することができますリスト自体の型ではなく、リストの内容の一部です。
"トランスポート"だけのノードを使用する必要はありません。

template <typename T> 
node<T>* insert_at(node<T>* head, int pos, T value) 
{ 
    node<T>* cur = head; 
    for (int i = 0; i < pos - 1; i++) 
    { 
     cur = cur->next; 
    } 
    node<T> *newnode = new node<T>; 
    newnode->value = value; 
    newnode->next = cur->next; 
    cur->next = newnode; 
    return head; 
} 

void main_function_insert_at() 
{ 
    cout << "Enter the position you want to add node and its value :"; 
    if (type) 
    { 
     cin >> add_pos >> add_int; 
     int_head = insert_at(int_head, add_pos, add_int); 
    } 
    else 
    { 
     cin >> add_pos >> add_str; 
     str_head = insert_at(str_head, add_pos, add_str); 
    } 
} 

(あなたは、いくつかの空のリストの取り扱いや範囲外のインデックスを追加することをお勧めします。)

+0

おかげでたくさん:Dそれが動作しますが、 テンプレートノード *とテンプレートとの違いは、<型名T> ものですT *これはテンプレートなので、後者の方が "self-made"型ポインタを受け入れるより一般的なものだと思いますが、前者はhmmmです。 私は知らなかった:( – Alfons

+0

@Alfons See update。 – molbdnilo

+0

それはとても助けになる:D、今日私はリンクされたリストプログラムをすべてのテンプレート関数で書き直して、 D – Alfons

関連する問題