0

在我的 main 方法中,以下代码在包含插入的行有错误。

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>>);

您将某些变量的值作为模板参数提供给类 template 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 回答