Qt Creator 的自动完成(智能感知)不适用于 std::vector 个元素
Qt Creator's autocomplete (intellisense) doesn't work for std::vector elements
如何使 Qt Creator 中的自动完成功能适用于 std::vector
?不工作正常吗?
例如,在一个全新的项目中,我创建了一个 struct foo { int bar; };
。如果我创建一个 foo 的 QVector,intellisense/autocomplete 工作正常:
但是对于 std::vector<foo> v2
没有任何反应 在我按下 v2[0].
中的点之后
我在 Qt Creator 3.3.0 上,使用 Visual Studio 编译器工具链(所以 STL 来自 VS,而不是 gcc,如果有什么区别的话)。
编辑: 我发现了一个已报告的相关错误(不过是关于迭代器的)- https://bugreports.qt.io/browse/QTCREATORBUG-1892。我也重现了这个问题。
编辑 2: 我使用自定义模板进行了测试 class:
struct bar {
int b;
};
template<class T> struct foo {
T operator [](int a) { return T(); }
};
它工作正常:
根据我的意见,这样做根本不可能。您可以提交错误报告,希望他们能修复它。
为了更好地解释,它与 std::vector 的实现有关:
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
其中 reference
被类型定义为 Allocator::reference
。显然 Qt Creator 在遵循原始 class 之后存在问题。
与 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& 定义的,您可以看到它为什么适用。
更新:查看 cppreference's page on vector,似乎在 C++11 之后,引用的类型定义应该简单地设为 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;};
我设法简化了@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);
,自动完成功能将起作用。
现在 clang 代码模型可用:
转到帮助-> 关于插件...-> 启用 ClangCodeModel
重新启动 Qt Creator。检查它是否被激活;
工具 -> C++ -> 代码模型
Voila 代码自动完成 std:vector。
如何使 Qt Creator 中的自动完成功能适用于 std::vector
?不工作正常吗?
例如,在一个全新的项目中,我创建了一个 struct foo { int bar; };
。如果我创建一个 foo 的 QVector,intellisense/autocomplete 工作正常:
但是对于 std::vector<foo> v2
没有任何反应 在我按下 v2[0].
我在 Qt Creator 3.3.0 上,使用 Visual Studio 编译器工具链(所以 STL 来自 VS,而不是 gcc,如果有什么区别的话)。
编辑: 我发现了一个已报告的相关错误(不过是关于迭代器的)- https://bugreports.qt.io/browse/QTCREATORBUG-1892。我也重现了这个问题。
编辑 2: 我使用自定义模板进行了测试 class:
struct bar {
int b;
};
template<class T> struct foo {
T operator [](int a) { return T(); }
};
它工作正常:
根据我的意见,这样做根本不可能。您可以提交错误报告,希望他们能修复它。 为了更好地解释,它与 std::vector 的实现有关:
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
其中 reference
被类型定义为 Allocator::reference
。显然 Qt Creator 在遵循原始 class 之后存在问题。
与 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& 定义的,您可以看到它为什么适用。
更新:查看 cppreference's page on vector,似乎在 C++11 之后,引用的类型定义应该简单地设为 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;};
我设法简化了@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);
,自动完成功能将起作用。
现在 clang 代码模型可用:
转到帮助-> 关于插件...-> 启用 ClangCodeModel
重新启动 Qt Creator。检查它是否被激活; 工具 -> C++ -> 代码模型
Voila 代码自动完成 std:vector。