HashMap - 插入类型错误

时间:2013-02-18 17:31:54

标签: c++ templates

在我的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

2 个答案:

答案 0 :(得分:4)

您正在混淆实例化类模板以获取类型的语法,用于实例化类型以获取对象。

pair<name, pair<date, homeTown>>

应该是

make_pair(name, make_pair(date, homeTown))

或者如果你可以使用C ++ 11

{name, {date, homeTown}}

答案 1 :(得分: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<>的正确实例化,从而减轻您明确指定模板的负担参数。