Qt Creator的自动补全(Intellisense)无法为std :: vector元素工作

7
我该如何让Qt Creator中的自动补全功能支持std::vector?它不能正常工作吗?
例如,在一个新项目中,我创建了一个struct foo { int bar; };。如果我创建一个foo的QVector,智能提示/自动补全就可以正常工作:

enter image description here

但是对于一个std::vector<foo> v2,在我按下v2[0].什么都没有发生

我使用的是Qt Creator 3.3.0,在使用Visual Studio编译器工具链(所以STL来自VS,而不是gcc,如果有任何区别的话)。

编辑:我找到了一个相关的错误报告(关于迭代器),链接为https://bugreports.qt.io/browse/QTCREATORBUG-1892。我也重现了这个问题。

编辑2:我测试了一个自定义模板类:

struct bar {
    int b;
};
template<class T> struct foo {
    T operator [](int a) { return T(); }
};

而且它工作得很好:

enter image description here


很遗憾,Qt Creator的代码模型在处理模板时存在问题。曾经有一些工作正在进行中,以使其使用clang的模型,但我不知道最终结果如何。 - Cássio Renan
@cassiorenan 顺便问一下,你也遇到这个问题了吗? - sashoalm
是的,我是。我正在使用Qt Creator 3.3.2。 顺便说一下,你的测试有缺陷。尝试实现一个简单地返回a的operator[]函数。 - Cássio Renan
@cassiorenan 谢谢,我修复了测试(它仍然可以工作)。 - sashoalm
是的,我在这里进行了测试,注释后仍然出现问题。显然,std::vector的实现是罪魁祸首。请检查答案。 - Cássio Renan
3个回答

5
根据我的评论,这是不可能实现的。您可以提交一个错误报告并希望他们能够修复它。 更好的解释是,这与std :: vector的实现有关:
reference operator[](difference_type _Off) const
    {   // subscript
    return (*(*this + _Off));
    }

在其中,reference 被定义为 Allocator::reference。显然,Qt Creator 在跟踪到原始类时存在问题。与 QVector 的情况进行比较...
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
  return data()[i]; }

...这是直接基于T&定义的,您可以看出为什么它适用于T&。

更新:查看cppreference关于vector的页面,在C++11之后,引用应该被typedef为value_type&。我尝试使用CONFIG += c++11构建,但仍然不起作用。

另一个更新:我成功编写了一个无法正常工作的最小测试案例。

template<typename T>
class foo{
public:
    typedef T value_type;
    typedef value_type& reference;
    T a;
    reference operator[](int){return a;}
};

struct bar{int b;};

4

现在clang代码模型已经可用:

进入“帮助”->“插件管理” -> 启用ClangCodeModel

重新启动Qt Creator。检查它是否被激活; 工具 -> C++ -> 代码模型

很棒,现在可以自动完成std:vector中的代码。


0

我成功地简化了@Cassio的示例代码以重现问题:

struct T { int b; };
struct foo{
    typedef T value_type;
    T a;
    value_type operator[](int);
    value_type bar();
};

有趣的是,a.bar().可以工作,但a[1].不行。而且,最能说明问题的是,如果你将operator[]声明为foo::value_type operator[](int);,自动完成就会起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接