0

私のメインメソッドでは、次のコードに挿入を含む行でエラーがあります。

hashTable<string, pair<string, string>> friendsHash = hashTable<string, pair<string, string>>(friendTotal);
        if(critChoice == 1)
        {
            for(int counter = 0; counter < friendTotal; counter ++)
            {
                string name = friends[counter].getName();
                string date = friends[counter].getBirthDate();
                string homeTown = friends[counter].getHomeTown();
                friendsHash.insert(pair<name, pair<date, homeTown>>);
            }
        }

hashMapの挿入関数は次のとおりです。

template<class K, class E>
void hashTable<K, E>::insert(const pair<const K, E>& thePair)
{
    int b = search(thePair.first);

    //check if matching element found
    if(table[b] == NULL)
    {
        //no matching element and table not full
        table[b] = new pair<const K, E> (thePair);
        dSize ++;
    }
    else
    {//check if duplicate or table full
        if(table[b]->first == thePair.first)
        {//duplicate, change table[b]->second
            table[b]->second = thePair.second;
        }
        else //table is full
            throw hashTableFull();
    }
}

エラーは、挿入関数の3つの引数のそれぞれが呼び出すことですis not a valid template type argument for parameter

4

2 に答える 2

4

クラステンプレートをインスタンス化して型を取得するための構文と、型をインスタンス化してオブジェクトを取得するための構文を混乱させています。

pair<name, pair<date, homeTown>>

する必要があります

make_pair(name, make_pair(date, homeTown))

または、C++11を使用できる場合

{name, {date, homeTown}}
于 2013-02-18T17:35:55.173 に答える
1

この行で:

friendsHash.insert(pair<name, pair<date, homeTown>>);

いくつかの変数の値をテンプレート引数としてクラステンプレートに提供していますpair<>。これは根本的な誤解です。テンプレート引数はコンパイル時に認識されている必要があります。したがって、変数にすることはできません。

ただし、ここでおそらく実行しようとしているのは、pair<>クラステンプレートの正しいインスタンス化を指定することではなく、そのタイプのインスタンスpair<string, pair<string, string>>を生成することです。

したがって、おそらくその行を次のように変更する必要があります。

friendsHash.insert(make_pair(name, make_pair(date, homeTown)));

ヘルパー関数テンプレートmake_pair<>()は、引数のタイプを推測し、の正しいインスタンス化を生成できるためpair<>、テンプレート引数を明示的に指定する負担から解放されます。

于 2013-02-18T17:39:32.643 に答える