当使用vim插件YouCompleteMe实现C++代码完成时,我偶然发现了一个问题。
使用嵌套模板类会使完成工作无法正常进行。
请考虑以下示例来重现该行为:
#include <vector>
template<class T>
class foo {
public:
void Init();
private:
struct bar {
int foobar;
};
bar one_bar;
std::vector<foo<T>::bar> some_bars;
};
template<class T>
void foo<T>::Init(){
one_bar.foobar = 0; // completion as expected
some_bars.at(0).foobar = 0; // no completion neither for "at" nor for "foobar"
}
“some_bars”的代码完成完全不起作用,而“one_bar”的行为却与预期的一样。
我如何才能完成此代码的工作?此问题与设置有关并且应该可以正常工作吗?还是YCM中的错误?
我的系统是基于debian jessie/sid的,vim版本7.4,是GitHub的YCM最新版本。
编辑:
YCM的错误跟踪器中报告了类似的问题:
https://github.com/Valloric/YouCompleteMe/issues/243
https://github.com/Valloric/YouCompleteMe/issues/530
似乎是在clang中而不是YCM中的错误。有人可以确认吗?
编辑2:
我在YCM问题跟踪器中打开了另一个问题。
https://github.com/Valloric/YouCompleteMe/issues/1170
目的是获得有关clang中的确切错误的更多信息,并最终在clang问题跟踪器中报告错误。
编辑3:
我遵循RedX提出的建议过程,并用clang填充了我的代码以获取完成。
Clang没有为代码中的讨论位置提供任何建议。
这显然是YCM无法在vim中提出建议的原因,而与YCM或vim无关。
已提交clang问题跟踪器中的错误报告:
http://llvm.org/bugs/show_bug.cgi?id=20973
最佳答案
我认为,根据C++的规则,在这种情况下您无法获得完成。
在不了解T
类型的情况下,我们不知道std::vector<T>
将使用哪些方法,因为C++中模板的每个实例都可以具有不同的方法。