Как я могу сделать make_pair в методе класса шаблона, используя unordered_multimap? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующий код, я знаю, что я почти переопределяю контейнер, но я хочу сделать так, у меня будут более конкретные методы, и я не хочу повторять код для мультикарт разных типов:

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 и userName & programName и QString , я получаю сообщение об ошибке, в котором не может преобразовать аргумент из QString в _Ty1 &&.

С другой стороны, как у меня может быть такой итератор:

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

Возможно ли это?Это также показывает ошибку, я должен использовать <QString, QString>

Спасибо.

1 Ответ

2 голосов
/ 09 июля 2019

Поскольку C ++ 11 make_pair определяется следующим образом:

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

с помощью std::make_pair<QString, TYPE> вы указываете T1 и T2 как QString, поэтому сигнатура make_pair(QString&&, QString&&) и компилятор отклоняет это, потому что elementName и T являются L-значениями.Lvalue не может быть привязан к ссылке Rvalue.

Чтобы это исправить, вы должны заменить

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

на

std::make_pair(elementName, T)

, тогда вы позволите пересылке ссылок работать здесь, и T1T2 будет выводиться следующим образом: const QString& и код работает нормально - Lvalue может быть привязан к ссылкам Lvalue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...