我有这样的代码:
template<class ListItem>
static void printList(QList<ListItem>* list)
{
for (auto i = list->size() - 1, j = -1; i >= 0; --i) {
std::cout << i << ", " << j << ": " << list->at(i) << std::endl;
}
}
当我使用g++ 6.2.1编译它时,我得到了以下的编译器输出:
test.cpp: In function ‘void printList(QList<T>*)’:
test.cpp:10:7: error: inconsistent deduction for ‘auto’: ‘auto’ and then ‘int’
for (auto i = list->size() - 1, j = -1; i >= 0; --i) {
^~~~
如果变量有不同的类型,比如
auto i = 0.0, j = 0;
,我可以理解这个问题。但在这种情况下,list是指向QList的指针,其size()方法返回int
,-1
本身也应该是int
。错误消息也有点奇怪。变量i和j仅在此循环中需要,我想将它们声明为循环参数。输入int
而不是auto并不难,但我想知道:是否不应该使用auto
来一次性声明多个变量,或者我在这里漏掉了什么,这真的是错误的代码,还是编译器的错误?
P.S. 看起来使用模板函数是关键部分,在模板之外分离循环不会产生错误。因此,更像是编译器的一个错误?
modelList
是一个QList
,但你的编译器显然不同意,所以我想知道到底哪一方出了问题。但我无法看到编译器看到的代码,因此希望能看到相同的代码。 - Angew is no longer proud of SOmodelList
是一个QList
吗? - Hatted Roosterauto
必须被推导为相同的类型。 - achlist->size()
的类型,因为list
依赖于模板参数。请记住,QList<ListItem>
可以被特化以使list->size()
返回除int
之外的其他类型。 - ach