【问题标题】:Why can't I use QList::size_type as I would std::string::size_type? (template parameter error)为什么我不能像 std::string::size_type 那样使用 QList::size_type? (模板参数错误)
【发布时间】:2017-11-25 21:02:46
【问题描述】:

在我的 for 循环中声明迭代器时研究无符号与有符号整数比较警告时,I read this

尽可能使用您要比较的确切类型(例如,在与std::string 的长度进行比较时使用std::string::size_type)。

我有一个QList<T>我想迭代,使用上面的方法声明迭代器:

 for(QList::size_type i = 0; i < uploads.size(); i++)
 {
     //Do something
 }

它给了我一个编译器错误:

error: 'template<class T> class QList' used without template parameters
for(QList::size_type i = 0; i < uploads.size(); i++)

为什么我不能以同样的方式使用它?这是由我还是由 Qt 框架及其类型引起的?在这种情况下,QList::size_type 有什么好的替代品,QList::size() 只是返回一个普通的旧int,我想使用它;但我阅读了上面链接的帖子,这让我不确定。

【问题讨论】:

  • 或者,你有什么改变使用auto吗?
  • @appleapple 如何在这里使用autoauto i = 0 好像错了。
  • @songyuanyao 对不起,你是对的。可能是基于for(auto&amp; x : uploads) 的范围?
  • @appleapple 对于auto i = 0;i 的类型将为int;这不是 OP 想要的确切类型
  • 致 OP:也许您可以改用 begin()end()。或decltype.

标签: c++ qt templates class-template dependent-name


【解决方案1】:

QList 是一个类模板,这意味着你应该在使用它时指定模板参数,例如QList&lt;int&gt;QList&lt;int&gt;::size_type

顺便说一句:std::stringstd::basic_string 的实例化,它是定义为 std::basic_string&lt;char&gt; 的 typedef。所以std::string::size_type实际上等价于std::basic_string&lt;char&gt;::size_type

【讨论】:

    【解决方案2】:

    您不能以相同的方式使用它,因为它们不是同一个东西。 std::string 实际上是std::basic_string&lt;char&gt; 的别名,这就是为什么您在使用它时不必指定模板类型的原因。

    由于Qlist 不是别名,而是您必须使用的模板类型

    QList<some_type>::size_type
    

    您可以做的一件事是创建自己的别名

    using QIntList = QList<int>;
    

    然后你就可以了

    QIntList::size_type
    

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2019-08-08
      • 2012-05-18
      • 2010-11-13
      • 2019-04-25
      • 1970-01-01
      • 2017-12-23
      • 2018-02-15
      • 2021-10-31
      相关资源
      最近更新 更多