我有以下代码,我知道我几乎要重新实现容器,但是我想这样做,我将有更具体的方法, 我不想为不同类型的多地图重复代码:
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;
谢谢。
答案 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引用。