【发布时间】:2016-11-28 10:16:42
【问题描述】:
我有这样的代码:
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 本身应该是 @987654330 @, 也。错误信息也有点奇怪。
变量i 和j 仅在此循环中需要,我想将它们声明为循环参数。键入 int 而不是 auto 并不难,但我想知道:auto 是否不应该用于一次性声明多个变量,或者我在这里遗漏了一些东西,它确实是错误的代码,或者可能是编译器的错误?
附:看起来使用模板函数是这里的关键部分,将循环从模板中分解出来不会产生错误。那么,更像是编译器中的一个错误?
【问题讨论】:
-
minimal reproducible example,拜托。你写道
modelList是QList,但你的编译器显然不同意,所以我想知道哪个是错的。如果没有看到编译器所做的相同代码,我就无法做到这一点。 -
这至少是一个奇怪的用途。 Auto 是指基于其初始化表达式的单个参数自动确定,多个参数可以派生为不同的类型。
-
coliru.stacked-crooked.com/a/dc1ca01afe50201a 可以在 C++11 中正常工作,确定
modelList是QList? -
@dascandy 它errors.
-
啊,既然有完整的代码,那就说得通了。编译器无法推断出
list->size()的类型,因为list依赖于模板参数。请记住,QList<ListItem>可能是特化的,因此list->size()可能返回int以外的类型。