4

在我的 for 循环中声明迭代器时研究无符号与有符号整数比较警告时,我读到了这个

只要有可能,请使用您将与之比较的确切类型(例如,std::string::size_type与 astd::string的长度进行比较时使用)。

我有一个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,我想使用它;但我阅读了上面链接的帖子,这让我不确定。

4

2 回答 2

7

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

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

于 2017-06-22T14:11:22.163 回答
6

你不能以同样的方式使用它,因为它们不是一回事。Astd::string实际上是 的别名std::basic_string<char>,这就是为什么您在使用它时不必指定模板类型的原因。

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

QList<some_type>::size_type

您可以做的一件事是制作自己的别名,例如

using QIntList = QList<int>;

然后你可以

QIntList::size_type
于 2017-06-22T14:12:11.493 回答