如何使用unordered_multimap在模板类方法中进行make_pair

How can I do make_pair within a template class method using unordered_multimap?

本文关键字:类方法 make pair unordered 何使用 multimap      更新时间:2023-10-16

我有以下代码,我知道我几乎重新实现了容器,但是我想这样做,我将有更多特定的方法和我不想重复不同类型的多图的代码:

template<class TYPE>
class MapTemplate {
public:
    typedef typename std::unordered_multimap <QString, QString>::iterator iterator;
void addElement(const QString& elementName, const TYPE& T) {
    unorderedMultiMap.insert(std::make_pair<QString, TYPE>(elementName, T));
}
std::pair<iterator, iterator> getEqual_range(const QString& elementName) {
    return unorderedMultiMap.equal_range(elementName);
}
int removeElement(const QString& elementName) {
    return unorderedMultiMap.erase(elementName);
}
int getNumberOfElements() const {
    return unorderedMultiMap.size();
}
bool isMapEmpty() const {
    return unorderedMultiMap.isEmpty();
}
iterator isElementInMap(const QString& elementName) const {
    return unorderedMultiMap.find(elementName);
}
private:
    std::unordered_multimap<QString, TYPE> unorderedMultiMap;
};

我有两个有关的问题:如果我尝试userProgMap.addElement(userName, programName);MapTemplate<QString> userProgMap用户名&amp;programName两者qString ,我遇到一个错误,说无法将参数从qString转换为_ty1&amp;&amp;

另一方面,我怎么能拥有这样的迭代器:

typedef typename std::unordered_multimap <QString, TYPE>::iterator iterator;

有可能吗?这也显示出错误,我必须使用<QString, QString>

谢谢。

因为C 11 make_pair定义如下:

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );

通过std::make_pair<QString, TYPE>,您指定T1T2QString,因此签名为make_pair(QString&&, QString&&),并且编译器拒绝了这一点,因为elementNameT是LVALUES。LVALUE不能绑定到RVALUE参考。

要解决此问题,您应该替换

std::make_pair<QString, TYPE>(elementName, T)

std::make_pair(elementName, T)

然后,您在此处让转发引用工作,T1,T2将被推论为:const QString&,并且代码正常工作 - lvalue可以绑定到lvalue参考。