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