Qt Creator的自动完成(intellisense)对std :: vector元素不起作用

时间:2015-02-06 10:47:13

标签: c++ autocomplete stl qt-creator

如何在std::vector的Qt Creator工作中自动完成?不工作是正常的吗?

例如,在一个全新的项目中,我创建了一个struct foo { int bar; };。如果我创建一个foo的QVector,intellisense / autocomplete工作正常:

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

3 个答案:

答案 0 :(得分:5)

根据我的评论,根本不可能这样做。您可以提交错误报告,希望他们能够修复它。 为了更好地解释,它与std :: vector的实现有关:

reference operator[](difference_type _Off) const
    {   // subscript
    return (*(*this + _Off));
    }

其中reference的typedef为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&amp;来定义,你可以看出它为什么有效。

更新:看看cppreference's page on vector,似乎在C ++ 11之后,引用应该是typedef'ed,只是value_type&amp ;.我尝试使用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;};

答案 1 :(得分:4)

现在可以使用clang代码模型:

转到帮助 - &gt;关于插件...... - &gt;启用ClangCodeModel

重启Qt Creator。检查它是否已激活; 工具 - &gt; C ++ - &gt;代码模型

用于std:vector的Voila代码自动完成。

答案 2 :(得分: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);,则自动完成将起作用。