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

时间:2019-07-09 15:32:26

标签: c++ c++11 templates

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

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);和{em> userName和programName都设为QString ,{strong}会出现错误,提示无法将参数从QString转换为_Ty1 &&

另一方面,我如何拥有这样的迭代器:

MapTemplate<QString> userProgMap

有可能吗?这也显示了错误,我必须使用typedef typename std::unordered_multimap <QString, TYPE>::iterator iterator;

谢谢。

1 个答案:

答案 0 :(得分:2)

由于C ++ 11 public class POSViewModel : INotifyPropertyChanged { /// <summary> /// Property Changed Event Handler /// </summary> public event PropertyChangedEventHandler PropertyChanged; // Create the OnPropertyChanged method to raise the event protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } public ObservableCollection<TicketModel> _Tickets { get; set; } public ObservableCollection<TicketModel> Tickets { get { return _Tickets; } set { _Tickets = value; OnPropertyChanged(nameof(Tickets)); } } public POSViewModel() { Tickets = new ObservableCollection<TicketModel>(); } public void Add() { TicketModel Ticket = new TicketModel { ImageSource = @"H:\Good.png", Prix = 10, TicketId = 0 }; Tickets.Add(Ticket); } } public class TicketModel { private int ticketId; private float prix; private string imageSource; private ImageSource imageTicket; public int TicketId { get; set; } public float Prix { get; set; } public string ImageSource { get; set; } } 的定义如下:

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

通过

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

然后让转发引用在这里起作用,T1,T2将推导为:std::make_pair(elementName, T) 并且代码可以正常工作-Lvalue可以绑定到Lvalue引用。