为什么我不能使用QList :: size_type,因为我会使用std :: string :: size_type?(模板参数错误)

Zim*_*ano 4 c++ qt templates dependent-name class-template

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

尽可能使用您要比较的确切类型(例如,std::string::size_typestd::string长度比较时使用).

QList<T>想要迭代,使用上面的方法声明迭代器:

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

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

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

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

son*_*yao 7

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

BTW:std::stringstd :: basic_string的实例化,它是一个定义为的typedef std::basic_string<char>.所以std::string::size_type等同于std::basic_string<char>::size_type事实上.


Nat*_*ica 6

你不能以同样的方式使用它,因为它们不是同一个东西.A std::string实际上是别名std::basic_string<char>,这就是您在使用它时不必指定模板类型的原因.

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

QList<some_type>::size_type
Run Code Online (Sandbox Code Playgroud)

你可以做的一件事就是制作自己的别名

using QIntList = QList<int>;
Run Code Online (Sandbox Code Playgroud)

然后你就可以了

QIntList::size_type
Run Code Online (Sandbox Code Playgroud)