是否可以在自己的模板类中使用 QMultiMap::ConstIterator?

Posted

技术标签:

【中文标题】是否可以在自己的模板类中使用 QMultiMap::ConstIterator?【英文标题】:Is it possible to use to use QMultiMap::ConstIterator in own template class? 【发布时间】:2011-09-18 13:28:55 【问题描述】:

我想使用

遍历 QMultiMap
QMultiMap<double, TSortable>::const_iterator it;`

但编译器抱怨

error: expected ‘;’ before ‘it’

导致

error: ‘it’ was not declared in this scope

适用于各种用途。我尝试了ConstIteratorconst_iterator,甚至更慢的Iterator,但都没有成功。甚至可以将 Q(Multi)Map 与模板类一起使用吗?为什么定义(作为 void*)没问题时我不能声明迭代器?

我使用下面的代码(包括守卫省略):

#include <QtCore/QDebug>
#include <QtCore/QMap>
#include <QtCore/QMultiMap>
#include <limits>

/** TSortable has to implement minDistance() and maxDistance() */
template<class TSortable>
class PriorityQueue 
public:

  PriorityQueue(int limitTopCount)
      : limitTopCount_(limitTopCount), actMaxLimit_(std::numeric_limits<double>::max())
  
  

  virtual ~PriorityQueue()

private:
  void updateActMaxLimit()
    if(maxMap_.count() < limitTopCount_)
      // if there are not enogh members, there is no upper limit for insert
      actMaxLimit_ = std::numeric_limits<double>::max();
      return;
    
    // determine new max limit

    QMultiMap<double, TSortable>::const_iterator it;
    it = maxMap_.constBegin();
    int act = 0;
    while(act!=limitTopCount_)
      ++it;// forward to kMax
    
    actMaxLimit_ = it.key();

  

  const int limitTopCount_;
  double actMaxLimit_;
  QMultiMap<double, TSortable> maxMap_;// key=maxDistance
;

【问题讨论】:

【参考方案1】:

GCC 在您引用的错误之前给出了这个错误:

error: need ‘typename’ before ‘QMultiMap<double, TSortable>::const_iterator’ because ‘QMultiMap<double, TSortable>’ is a dependent scope

这解释了问题。添加typename关键字:

typename QMultiMap<double, TSortable>::const_iterator it;

它会构建。

【讨论】:

你是对的,不幸的是(事实证明......)我的 GCC(4.4.4 ubuntu)即使使用 -Wall 也没有显示该错误

以上是关于是否可以在自己的模板类中使用 QMultiMap::ConstIterator?的主要内容,如果未能解决你的问题,请参考以下文章

QMap::insertMulti 还是 QMultiMap?

Qt入门系列开发教程STL篇QMultiMap键值存储类使用方法

Qt532.容器QMap&QMultiMap

如何从 QMultiMap 中的值中获取键?

QMultiMap 结构为键,结构为值,比较运算符

将 QMultiMap<QString, QString> 导出到 QML